RxJS throwError的错误未显示在订阅的错误处理程序中

时间:2019-12-25 07:03:21

标签: angular rxjs

这是我的代码:

import { interval, throwError } from "rxjs";
import { take, map } from "rxjs/operators";

interval(1000)
  .pipe(
    take(5),
    map(x => {
      if (x > 0) {
        // throw new Error("error");
        return throwError(x);
      }
      return x;
    })
  )
  .subscribe(
    data => {
      console.log("data------>", data);
    },
    error => {
      console.log("error------>", error);
    }
  );

我尝试使用throwError在流的开始处返回错误,但是根据控制台日志,它们全部都落入了订阅成功处理程序中,该错误都是可观察到的。

但是,我希望错误落入错误处理程序中。我认为我必须误解了throwError的工作方式。我错过了什么?我怎样才能解决这个问题?而且我发现只有当我抛出真实的new Error时,错误才会落入错误处理程序

这里是演示:demo

1 个答案:

答案 0 :(得分:1)

throwError将返回Observable,而map ping只会将原始值包装在两个Observable中。

尝试返回包含数字的Observable,而不是简单地在number之外返回if。您可以使用of来做到这一点。

然后使用switchMap代替map

类似这样的东西:

import { interval, throwError } from "rxjs";
import { of } from "rxjs";
import { take, switchMap } from "rxjs/operators";

interval(1000)
  .pipe(
    take(5),
    switchMap(x => {
      if (x > 0) {
        // throw new Error("error");
        return throwError(x);
      }
      return of(x);
    })
  )
  .subscribe(
    data => {
      console.log("data------>", data);
    },
    error => {
      console.log("error------>", error);
    }
  );

  

这是您推荐的Working Sample Demo