为什么Rxjs会在出错时取消订阅?

mgr*_*nko 10 rxjs rxjs5

简而言之:如何在流中出现错误后继续监听,而不是.catch先放一个.subscribe

如果您需要更多详细信息,请访问:

让我们假设我有一个当前用户的主题或null.我有时从API获取数据并发送给主题.它相应地更新视图.但在某些时候我的服务器上发生错误,我希望我的应用程序继续像以前一样工作,但通知一些地方有关错误和KEEP听我的主题.

最初我认为如果我这样做userSubject.error(...)只会触发订阅上的.catch回调和error处理程序,并跳过所有成功处理程序和链.如果我打电话给userSubject.next(...)我所有的连锁店,订阅者将像以前一样工作

但不幸的是情况并非如此.在第一次未被捕获之后,.error它取消订阅流中的订阅者,并且它们不再操作.

所以我的问题:为什么??? 如果我想null正常处理值但是只在某些地方处理错误,该怎么做呢?

以下是RxJs源代码的链接,其中Subscriber取消订阅错误 https://github.com/ReactiveX/rxjs/blob/master/src/Subscriber.ts#L140

Ser*_*aev 10

Rxobservables 遵循语法 next*(error|complete)?,这意味着他们可以在通知errorcomplete通知发布后不产生任何内容.

Rx设计指南中可以找到解释为何重要的原因:

指示可观察序列已完成的单个消息确保可观察序列的消费者可确定地确定执行清理操作是安全的.

单个故障进一步确保可以为处理多个可观察序列的运算符维护中止语义.

总之,如果你希望你的观察员继续听已经出现服务器错误后的问题,也不能提供该错误的问题,而是在一些其他的方式处理它(如使用catch,retry或者将错误专用主题).


mar*_*tin 5

每个 Observable 都会发出零个或多个next通知和一个errorcomplete两个。

因此,Subjects 具有内部状态。

然后这取决于你如何构建你的链。例如,您可以使用retry()在出错时重新订阅其源 Observable。

或者,当您将值传递给主题时,您可以只发送next通知而忽略其他两个:

.subscribe(v => subject.next(v));
Run Code Online (Sandbox Code Playgroud)

或者,如果您想在用户所在时抛出错误,null您可以使用任何捕获异常并将其作为错误通知发送的运算符。例如像这样:

.map(v => {
    if (v === null) {
        throw new Error("It's broken");
    }
    return v;
})
Run Code Online (Sandbox Code Playgroud)

无论如何,没有任何代码就很难给出更精确的建议。