javascript - 我怎么知道 Observable 是有错误还是没有错误完成?

标签 javascript rxjs reactive-streams

我需要在 Observable 完成时执行一些代码,这取决于是否有错误完成。我有这段代码:

const obs = getMyObservable().pipe(finalize(() => {
    //here
}));

如您所见,我正在使用 finalize 运算符,但我不知道是否已完成,有或没有错误。 rxjs 中是否有某种doOnCompletedoOnError 运算符?

最佳答案

根据 https://www.learnrxjs.io/

使用最新的 RXJS,您可以使用这 3 个运算符

const obs = getMyObservable().pipe(                                       // Let's assume 'obs' returns an array
    tap(() => console.log('Action performed before any other')),
    catchError(() => { console.error('Error emitted'); return of([]); }), // We return [] instead
    finalize(() => console.log('Action to be executed always'))           // Either Error or Success
);
obs.subscribe(data => console.log(data));  // After everything, we log the output.

希望对你有帮助

根据 JoniJnm 评论编辑

更具体地说,有 3 个主要管道:

  1. 在订阅前确实会改变结果的管道。
  2. 在订阅前不会改变结果的管道。
  3. 特种管道。

Tap 例如来自第二种类型,它可以从 observable 或之前的管道中获取输入并对其执行任何操作,但不能更改管道的结果下一步。

Map 类似,但它属于第一种管道,它接受一个输入并必须返回一个输出,可以在下一个管道或最终管道中使用订阅。

Finalize 是一个特殊的管道,它的作用与 Tap 相同,但在订阅之后。例如,记录最终结果或在完成后取消订阅是很好的。

CatchError 是一个改变结果的管道,但只有在前一步抛出错误时才会调用它。这用于避免未处理的错误,你应该返回一个可观察的“默认”而不是失败的可观察的(所以我们处理错误并且应用程序不会中断)。

如果 catchError 已启动,您可以猜测您的 observable 何时出现错误,并在它到达订阅之前立即处理它。

如果此管道没有启动,则认为结果没有错误。

关于javascript - 我怎么知道 Observable 是有错误还是没有错误完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50409658/

相关文章:

java - 阻塞所有对象后,从列表中的 Monos 获取对象的值

scala - 在Akka流中,如何从 future 集合中创建无序来源

javascript - jQuery/JS - 计算元素内的元素数量

javascript - 使用来自多个异步调用的值,然后执行计算以推送值

angular - RXJS:返回外部可观察值的操纵值

rxjs - 创建一次性订阅

concurrency - 使用 ForkJoinPool.commonPool() 代替 RxJava 的计算调度程序

javascript - 表格中的输入导致表格宽度发生变化

javascript - 我如何制作一个将文本保存在数据库中并将文件上传到服务器上的表单

javascript - 仅使用 JS 控制台刷新元素