依次执行可观察对象并发出一个结果
Sequentially execute observables and emit one result
我有一个并行执行的可观察对象数组:
let observables: Observable<any>[]
Observable.forkJoin(observables)
这很完美,但是,我需要按顺序执行可观察对象数组,并且只在最后一个可观察对象完成时发出一个结果。那是我尝试使用
的时候
Observable.concat(observables)
但是这个 returns 多个结果,而不是我在使用 forkJoin 时得到的一个合并结果。所以我实际上需要两者的结合。
我尝试使用 reduce 功能按顺序执行它们,如下所示:
return observables.reduce((previous, current) => {
return previous.flatMap(() => current);
}, Observable.empty());
但使用此解决方案,根本不会执行可观察对象。
您可以使用 toArray()
运算符:
Observable.concat(observables).toArray().subscribe()
如 RxJS 文档中所述:它创建 "an observable sequence containing a single element with a list containing all the elements of the source sequence".
假设您的observables
发出单数值,不是数组,您可以将当前的方法改写为:
return Observable.concat(...observables).reduce((acc, current) => [...acc, current], []);
甚至更短:
return Observable.concat(...observables).toArray();
如果它们发出 array 值,您可以执行以下操作:
const source = Observable.concat(...observables).flatMap(list => list).toArray();
正如 or 在他们的回答中显示的那样,使用 RxJS 的新语法 你可以:
return concat(...observables).pipe(toArray());
我有一个并行执行的可观察对象数组:
let observables: Observable<any>[]
Observable.forkJoin(observables)
这很完美,但是,我需要按顺序执行可观察对象数组,并且只在最后一个可观察对象完成时发出一个结果。那是我尝试使用
的时候Observable.concat(observables)
但是这个 returns 多个结果,而不是我在使用 forkJoin 时得到的一个合并结果。所以我实际上需要两者的结合。
我尝试使用 reduce 功能按顺序执行它们,如下所示:
return observables.reduce((previous, current) => {
return previous.flatMap(() => current);
}, Observable.empty());
但使用此解决方案,根本不会执行可观察对象。
您可以使用 toArray()
运算符:
Observable.concat(observables).toArray().subscribe()
如 RxJS 文档中所述:它创建 "an observable sequence containing a single element with a list containing all the elements of the source sequence".
假设您的observables
发出单数值,不是数组,您可以将当前的方法改写为:
return Observable.concat(...observables).reduce((acc, current) => [...acc, current], []);
甚至更短:
return Observable.concat(...observables).toArray();
如果它们发出 array 值,您可以执行以下操作:
const source = Observable.concat(...observables).flatMap(list => list).toArray();
正如
return concat(...observables).pipe(toArray());