我有一个可观察的数组,我使用以下方式并行执行:
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。
答案 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.Toledo或Mateusz Witkowski的回答,使用 RxJS的新语法,您可以执行以下操作:
return concat(...observables).pipe(toArray());