【问题标题】:RxJs forkJoin: Execute when all observables have errored or succeededRxJs forkJoin:当所有可观察对象都出错或成功时执行
【发布时间】:2020-04-07 13:21:04
【问题描述】:

假设我有以下代码,其中一个 observable 抛出错误,另一个在延迟后成功:

let observables: Observable<String>[] = [
  of("string 1").pipe(delay(1000)),
  throwError("error")
];

observables.forEach((observable, i) => {
  observable.subscribe(val => {
    console.log('success ' + i);
  }, error => {
    console.log('error ' + i);
  })
})

forkJoin(observables).subscribe(res => {
  console.log('final success');
}, error => {
  console.log('final error');
});

此代码将记录以下内容:

error 1
final error
success 0

我可以使用哪种运算符或回调来执行一些代码所有可观察对象都成功或出错?目标是按以下顺序登录:

error 1
success 0
final error

另一个可接受的结果是在某处捕获错误并记录:

error 1
success 0
final success

我做了一个演示:https://stackblitz.com/edit/typescript-myfstw?file=index.ts

【问题讨论】:

    标签: typescript rxjs rxjs6


    【解决方案1】:

    一种方法是捕获错误并关闭流。

    而不是throwError("error") 将管道附加到它throwError("error").pipe(catchError(() =&gt; EMPTY)),然后有错误的流简单地完成而没有错误/值。如果你想要一个值,请将EMPTY 替换为of('valueYouWant')

    在原始流中捕获错误很重要,而不是在forkJoin 之后的pipe 中。

    自动化你可以做的catchError

    let observables: Observable<String>[] = [
      of("string 1").pipe(delay(1000)),
      throwError("error")
    ].map(obs => obs.pipe(catchError(() => EMPTY)));
    

    【讨论】:

    • 谢谢,但是如果我在 catchError 中返回 EMPTY,第二个 observable 将永远不会完成。我的代码只记录“成功 0”
    • 它确实完成了,但没有任何发射。 NEVER 不发射也不完成。如果您需要依赖数据 - 那么是的,of(null) 是正确的方法。
    • 是的,当所有单独的可观察对象都成功或失败时,我需要运行一个函数。这适用于(null)。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多