处理“ onNext”中热的,共享的,可观察到的错误的正确方法

用户名

在RxJS版本5中,以下代码导致两个订阅都经过三轮迭代后终止了该过程:

var Rx = require("rxjs");

const published$ = Rx.Observable.interval(1000).publish();

published$.subscribe(index => {
    console.log(`One: ${index}`);

    if (index == 3) throw new Error("ded.");
});

published$.forEach(index => {
    console.log(`Two: ${index}`);
});

published$.connect();

但是,我的理解是,在下一个处理程序中引发的错误只会取消订阅该特定的订阅,而不会导致基础的可观察项终止。我的预期输出是“一个”订阅将取消订阅,但是该间隔将继续为“两个”订阅产生结果。

此行为引起我一些问题,其中我可能对基础的可观察对象有多个订阅,但是对这些订阅中的任何一个抛出的异常都会导致基础的可观察对象完全终止。

当我在使用热模块重载进行开发时,这尤其令人烦恼,因为任何订阅中的任何编程错误都使我不得不刷新整个页面以重新启动可观察的序列。

有没有一种方法可以在不将我的每个订阅都包装在try / catch中的情况下,在下一个处理程序中引发异常以简单地取消订阅该ONE订阅,而不终止基础的可观察对象?

- - - - - - 编辑 - - - - - -

通过在“ subscribe”返回的订阅对象上将syncErrorThrowable设置为true,我已经找到了所需的行为。似乎唯一在代码库中将此设置为true的时间是通过“ do”运算符。

我应该利用这个领域吗?我觉得使用它很脏,但是另一方面,我感到奇怪的是,“ do”运算符具有与“ next”订阅处理程序不同的错误处理语义。

这是受此标志影响的主要代码块:https : //github.com/ReactiveX/RxJS/blob/master/src%2FSubscriber.ts#L132

如果将其设置为false,则将调用此方法:https : //github.com/ReactiveX/RxJS/blob/master/src%2FSubscriber.ts#L179

如果将其设置为true,则改为使用此方法:https : //github.com/ReactiveX/RxJS/blob/master/src%2FSubscriber.ts#L188

不同之处在于,第一种方法将异常重新引发回调用堆栈,而第二种方法则将错误传播给后续订阅。

为什么do运算符会向前传播错误,而“ next”处理程序会使错误回退呢?这对我来说似乎很奇怪。

泰勒

不,请勿使用该字段。如果将其更改回true,您的订阅将开始出现吞咽错误。

这是一个私有状态,用于了解是同步(在与源Observable的订阅调用相同的块中)还是异步地通知Subscription。如果在同步通知期间从订阅服务器的消息处理程序之一引发错误,我们将推迟重新抛出该错误,直到退出Observable的订阅回调为止。[1]

如果您的处理程序抛出要转发给订阅onError处理程序的错误,则本指南将它们移到do订阅上方的块中。

不,我不同意这种行为。这是上下文的一些链接:

[1]来源:我写了这段代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可观察到像Lmax Disruptor这样的批处理

来自分类Dev

如何处理axios httpservice可观察到的响应?

来自分类Dev

如何取消订阅或处理Angular2或RxJS中可观察到的间隔?

来自分类Dev

可以观察到通过改造来处理网络错误

来自分类Dev

可观察或观察者中的错误处理?

来自分类Dev

可以观察到定期处理目录中的文件

来自分类Dev

使用异步管道只是为了处理可观察到的

来自分类Dev

如何最好地处理模板上可观察到的多个订阅?

来自分类Dev

如何处理可能为空的rxjs可观察到的响应?

来自分类Dev

Mobx 和 React。可观察到的变化后如何处理焦点输入?

来自分类Dev

在RxSwift中处理一次性可观察对象的正确方法

来自分类Dev

可观察到的在onNext()中不传递任何内容

来自分类Dev

处理角度2服务中的可观察错误

来自分类Dev

可观察的异常处理

来自分类Dev

Rxjava处理链式可观察的错误

来自分类Dev

Angular 2中的部分可观察处理

来自分类Dev

可观察到的每个订阅产生一个项目-每个处理程序一个事件

来自分类Dev

可观察到的错误

来自分类Dev

按 SQL 分组时处理未观察到的类别

来自分类Dev

无需观察对象即可观察到热

来自分类Dev

从期货可观察到-来自多个线程的onNext

来自分类Dev

Angular Firebase 和可观察的错误处理

来自分类Dev

如何在RxJS(或Reactive Extensions中的常规)中实现可观察到的时间到期热

来自分类Dev

可观察到的FromEventPattern INotifyCollectionChanged错误

来自分类Dev

处理错误

来自分类Dev

处理错误

来自分类Dev

Angular RxJS-无法使冷可观察到热

来自分类Dev

如何在RxJS中处理循环依赖的可观察变量?

来自分类Dev

Angular 2中的身份验证,处理可观察对象

Related 相关文章

热门标签

归档