【问题标题】:Concat Array of Observables and have a single subscription outputConcat Array of Observables 并具有单个订阅输出
【发布时间】:2019-05-15 13:05:43
【问题描述】:

我的软件中有几个案例,其中我有一组可观察对象,我需要按顺序执行它们。只有在上一个订阅完成后才会进行下一个订阅。

所以我使用concat 运算符。它工作得很好,但是每次Observables 之一完成时都会触发它的订阅,我需要只有在一切完成后才触发它。

concat(
  of(1, 2, 3).pipe(delay(3000)),
  // after 3s, the first observable will complete and subsquent observable subscribed with values emitted
  of(4, 5, 6).pipe(delay(3000)),
)
  // log: 1,2,3,4,5,6
  .subscribe((v) => {
  // Needs to be triggered once after everything is complete
    console.log(v);
  });

我需要一种方法来管道这个 observable,这样订阅只会在一切完成后触发一次,在这种情况下,订阅的值并不重要,因此可以省略。

如果可能,这些值可以在订阅上下文中以数组的形式提供。

【问题讨论】:

标签: javascript rxjs observable


【解决方案1】:

使用toArray 收集数组中的值。

import { toArray } from 'rxjs/operators';

concat(
  of(1, 2, 3).pipe(delay(3000)),
  of(4, 5, 6).pipe(delay(3000)),
).pipe(
  toArray()
).subscribe(v => console.log(v)); // log: [1,2,3,4,5,6]

或者,如果您不需要响应,请使用 @Willem 解决方案中的 complete 回调。

【讨论】:

  • 这效果最好,因为它在我的上下文中是一个更清洁的解决方案,在使用 observable 的任何地方添加complete callback 会很困难。作为额外的奖励,如果我需要数据,它将作为数组提供。
【解决方案2】:

将结果输入finalize():

当 observable 完成或出错时调用函数

https://www.learnrxjs.io/operators/utility/finalize.html

订阅complete事件:

.subscribe({
  complete: () => { ... }
})

使用forkJoin(),特别是如果您想要最终值:

当所有 observables 完成后,发出每个 observables 最后发出的值。

https://www.learnrxjs.io/operators/combination/forkjoin.html

【讨论】:

  • 我不认为 forkJoin 是 OP 想要的,它不会按顺序执行 observables。
  • forkJoin 不能在这种情况下使用,因为它不会等待上一个 observable 来订阅下一个 @fridoo 的解决方案最适合我,toArray() 管道它非常适合我的上下文的更清洁的解决方案。
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多