我正在玩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运算符,它似乎工作正常。
Map运算符将您选择的函数应用于每个项目 由源Observable发出,并返回发出的Observable 这些功能应用的结果。
Documentation for Observable.throw:
返回以异常终止的可观察序列, 使用指定的调度程序发送单个onError消息。
有人知道为什么在地图运算符中使用Observable.throw时,error
回调未被调用,而为什么进程不会被中断?< / p>
我知道我可以使用常规投掷并继续前进,我已经有了一个有效的解决方案,我出于好奇而发布这个问题,以便更好地理解框架是如何工作的。
快速提醒:stackoverflow有一个be nice policy。
答案 0 :(得分:0)
其中一条评论正确回答了这个问题:
throw new Error(x)
会抛出一个异常,只会在进程顶部冒泡。
x => Rx.Observable.throw(x)
只是创建一个表示错误的结构。对于map
运算符,此结构是一个与任何其他值一样的值,用于调用成功处理程序。另一方面,flatMap
将获取结构并将其解包,然后调用错误处理程序。