【问题标题】:Why does Rxjs unsubscribe on error?为什么 Rxjs 出错时退订?
【发布时间】:2023-03-04 16:17:01
【问题描述】:

简而言之: 如何在流中出现错误后继续收听而不在每个 .subscribe 之前放置 .catch

如果您需要更多详细信息,请点击此处:

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

最初我认为如果我只执行userSubject.error(...),它只会在订阅时触发.catch 回调和error 处理程序,并跳过所有成功处理程序和链。 如果在我拨打 userSubject.next(...) 之后,我所有的连锁店和订阅者都会像以前一样工作

但不幸的是,事实并非如此。在第一个未捕获的.error 之后,它会从流中取消订阅订阅者并且他们不再操作。

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

这里是 RxJs 源代码的链接,订阅者在出错时取消订阅 https://github.com/ReactiveX/rxjs/blob/master/src/Subscriber.ts#L140

【问题讨论】:

    标签: rxjs rxjs5


    【解决方案1】:

    Rx observables follow the grammar next*(error|complete)?,表示在errorcomplete 通知发送后他们什么都不会产生。

    可以从Rx design guidelines 找到有关此问题的解释:

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

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

    简而言之,如果您希望您的观察者在发生服务器错误后继续监听主题,请不要将该错误传递给主题,而是以其他方式处理它(例如使用catch、@987654328 @ 或将错误传递给专门的主题)。

    【讨论】:

    • 如果你有一些理由传递错误但仍然没有关闭 observable,那么你可以捕获并返回错误而不是抛出它。这样,observable 的类型就会从 Observable 变为 Observable 并且 observable 不会因错误而关闭。
    【解决方案2】:

    每个 Observable 都会发出零个或多个 next 通知和一个 errorcomplete,但绝不会同时发出两者。

    因此,主题具有内部状态。

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

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

    .subscribe(v => subject.next(v));
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 2016-01-12
      • 1970-01-01
      相关资源
      最近更新 更多