gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:01:36 25 4
gpt4 key购买 nike

我正在研究 Rxjs、可观察值和映射,我发现 Observable.throw(error) 有一个我无法解释的奇怪行为。

如果我有一个使用映射运算符的 Rx 流,并且我想中断该过程,我会期望方法 Observable.throw 是合适的,但是,这似乎并不合适就这样吧。

考虑以下示例:

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")
);

输出:

Error: test 2 at Rx.Observable.just.map.x ((index):58) at c (rx.all.compat.js:61) at 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)error: "test 3" scheduler: a__proto__: g

正如 @Whymarr 指出的那样,如果我使用 flatMap 运算符,它似乎工作得很好。

Documentation for map :

The Map operator applies a function of your choosing to each item emitted by the source Observable, and returns an Observable that emits the results of these function applications.

Documentation for Observable.throw :

Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.

有谁知道为什么在 map 操作符中使用Observable.throw时,error回调没有被调用,以及为什么这个过程没有被调用中断?

Example in jsfiddle

我知道我可以使用常规的 throw 并继续,我已经有了一个可行的解决方案,出于好奇我发布这个问题是为了更好地理解框架的工作原理。

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

最佳答案

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

throw new Error(x) 抛出一个异常,该异常只是冒泡到进程的顶部。

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

关于javascript - 为什么 Rx.Observable.throw(x) 实际上没有抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42101445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com