Concat的Observable数组,具有单个订阅输出

时间:2019-05-15 13:05:43

标签: javascript rxjs observable

我的软件中有几种情况,其中有一系列可观察的对象,需要按顺序执行它们。只有在上一个订阅完成后才能进行下一个订阅。

因此,我使用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);
  });

我需要一种方法来传递此可观察的消息,以便在完成所有操作后仅触发一次订阅,在这种情况下,订阅的值并不重要,因此可以省略。

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

2 个答案:

答案 0 :(得分:3)

如果不需要响应,请像在@Willem的解决方案中一样使用complete callback

否则,您可以将值收集到数组中。

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]

答案 1 :(得分:2)

将结果放入finalize()

  

在可观察到的完成或错误时调用函数

请参见https://www.learnrxjs.io/operators/utility/finalize.html

订阅complete事件:

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

使用forkJoin(),尤其是在您需要最终值的情况下:

  

所有可观测值完成后,从每个可观测值中发出最后一个发出的值。

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