我有一个必须按顺序执行的观察值数组,但我需要返回冷的观察值集(没有订阅),以便可以执行额外的链接。
const work = [observable1, observable2, observable3];
如果I return concat(...work)
和一些东西试图从它链接work$.pipe(switchMap(() => ...))
,则switchMap将为concat内部的每个可观察对象执行- 3次。
我正在寻找类似于forkJoin的东西,其中forkJoin(...work).pipe(switchMap(() => ...))
的switchMap只执行一次。但我不能只使用forkJoin,因为顺序也必须保留。
到目前为止,我找到的选项是:
- Return
forkJoin(concat(...work))
在技术上是可行的,因为forkJoin将等待单个concat完成,但它也感觉不对,因为我只给forkJoin一个observable,只是为了等待它完成的副作用,当它专门用于处理多个observable时。 - Return
concat(...work).pipe(toArray())
可能比forkJoin更好,但我仍然觉得我缺少一个更好的操作符。还有takeLast()
,它的功能大致相同,但仍然感觉不对,因为它似乎暗示我只关心最后一个值,而我只是想要完成。几乎类似于finalize(),但它会发出,因此它可以用来阻塞流。
(Stackblitz examples here)
有没有更好的操作符来等待concat完成,或者只是一个更好的替代concat的方法,它会按顺序执行observables,让我像forkJoin一样链接结果?感觉就像forkJoin的存在一样,他们有等待多个observables完成的操作符,他们有维护顺序的操作符,必须有一个基本的,我错过了,只是等待一个源observable完成,然后发出。
1条答案
按热度按时间2jcobegt1#
我不认为您到目前为止提出的解决方案有任何问题,但也许您会发现以下使用
concat
和reduce
的解决方案更好地传达了您的意图:concat
表示observables将按顺序执行。reduce
在其源发出() => undefined
表明您并不真正关心值StackBlitz演示。