为什么Rx.Observable.throw(x)实际上没有抛出?

时间:2017-02-07 22:45:37

标签: javascript rxjs reactivex

我正在玩Rxjs,observables和地图,我发现Observable.throw(error)的一个奇怪的行为,我无法解释。

如果我有一个使用map运算符的Rx流,并且我想中断该过程,我希望方法Observable.throw是合适的,但是,似乎并非如此。< / p>

考虑以下示例:

Rx.Observable.just("test 1").subscribe(
    x => console.log(x),
  err => console.log(err),
  () => console.log("done, no errors")
);

现在让我们引入一个错误,如果我使用Javascript中的常规throw它会按预期工作:

Rx.Observable.just("test 2").map(
    x => { throw new Error(x) }
).subscribe(
    x => console.log(x),
  err => console.log(err),
  () => console.log("done - error was thrown, as expected")
);

输出:

  

错误:测试2       在Rx.Observable.just.map.x((索引):58)       在c(rx.all.compat.js:61)       在e.onNext(rx.all.compat.js:5169)       (...)

但是如果我使用Rx.Observable.throw(...),则永远不会调用来自以下订阅者的error回调,而是调用next回调,而是使用一些奇怪的对象似乎是一个Rx错误对象。

Rx.Observable.just("test 3").map(
    x => Rx.Observable.throw(x)
).subscribe(
    x => console.log(x),
  err => console.log(err),
  () => console.log("done - it does not work... why?")
);

输出:

  

b_subscribe:f(a)错误:“测试3”调度程序:a__proto __:g

正如@Whymarrh指出的那样,如果我使用flatMap运算符,它似乎工作正常。

Documentation for map

  

Map运算符将您选择的函数应用于每个项目   由源Observable发出,并返回发出的Observable   这些功能应用的结果。

Documentation for Observable.throw

  

返回以异常终止的可观察序列,   使用指定的调度程序发送单个onError消息。

有人知道为什么在地图运算符中使用Observable.throw时,error回调未被调用,而为什么进程不会被中断?< / p>

Example in jsfiddle

我知道我可以使用常规投掷并继续前进,我已经有了一个有效的解决方案,我出于好奇而发布这个问题,以便更好地理解框架是如何工作的。

快速提醒:stackoverflow有一个be nice policy

1 个答案:

答案 0 :(得分:0)

其中一条评论正确回答了这个问题:

throw new Error(x)会抛出一个异常,只会在进程顶部冒泡。

x => Rx.Observable.throw(x)只是创建一个表示错误的结构。对于map运算符,此结构是一个与任何其他值一样的值,用于调用成功处理程序。另一方面,flatMap将获取结构并将其解包,然后调用错误处理程序。