按顺序执行observable并发出一个结果

时间:2018-01-20 17:01:06

标签: rxjs observable sequential

我有一个可观察的数组,我使用以下方式并行执行:

let observables: Observable<any>[]

Observable.forkJoin(observables) 

这很好用,但是,我需要按顺序执行observables数组,如果最后一个observable已经完成,则只发出一个结果。我尝试使用

的时候
Observable.concat(observables)

但是这会返回多个结果,而不仅仅是一个 - 结合 - 使用forkJoin时获得的结果。所以我实际上需要两者的结合。

我尝试使用reduce功能按顺序执行它们,如下所示:

return observables.reduce((previous, current) => {
  return previous.flatMap(() => current);
}, Observable.empty());

但是使用这个解决方案,根本不执行observable。

3 个答案:

答案 0 :(得分:5)

假设您的obserables发出单数值,不是数组,您可以将当前的方法修改为:

return Observable.concat(...observables).reduce((acc, current) => [...acc,current], []);

甚至更短:

return Observale.concat(...observables).toArray();

如果它们发出数组值,您可以执行以下操作:

const source= Observable.concat(...observables).flatMap(list => list).toArray();

答案 1 :(得分:4)

您可以使用toArray()运算符:

Observable.concat(observables).toArray().subscribe()

如RxJS文档中所述:它创建“包含单个元素的可观察序列,其中包含包含源序列的所有元素的列表”。

答案 2 :(得分:0)

根据Jota.ToledoMateusz Witkowski的回答,使用 RxJS的新语法,您可以执行以下操作:

return concat(...observables).pipe(toArray());