Javascript Concat阵列的观测值和有一个单一的订阅输出

Javascript Concat阵列的观测值和有一个单一的订阅输出,javascript,rxjs,observable,Javascript,Rxjs,Observable,在我的软件中,我有几个案例,其中我有一系列的观察对象,我需要按顺序执行它们。只有在上一个订阅完成后才能进行下一个订阅 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:

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

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);
  });
因此,我使用
concat
操作符。它工作得很好,但是它的订阅会在每次完成一个
可观察对象时被触发,我需要在一切完成后才触发它

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);
  });
我需要一种方法来处理这个可观察对象,这样在所有事情完成后,订阅只会触发一次,在这种情况下订阅的值并不重要,所以可以忽略它

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

将结果导入
finalize()
: 当observable完成或出现错误时调用函数

订阅
complete
事件: 使用
forkJoin()
当所有观测值完成时,从每个观测值发出最后发出的值


使用收集数组中的值


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

这可能会有所帮助:。我不认为
forkJoin
是OP想要的,因为它不会按顺序执行观测值。forkJoin不能在此上下文中使用,因为它不会等待上一个观测值来订阅下一个观测值@fridoo的解决方案对我来说最有效,
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]