typescript 等待有序可观量和链结果的正确方法

64jmpszr  于 2023-04-07  发布在  TypeScript
关注(0)|答案(1)|浏览(90)

我有一个必须按顺序执行的观察值数组,但我需要返回冷的观察值集(没有订阅),以便可以执行额外的链接。

const work = [observable1, observable2, observable3];

如果I return concat(...work)和一些东西试图从它链接work$.pipe(switchMap(() => ...)),则switchMap将为concat内部的每个可观察对象执行- 3次。
我正在寻找类似于forkJoin的东西,其中forkJoin(...work).pipe(switchMap(() => ...))的switchMap只执行一次。但我不能只使用forkJoin,因为顺序也必须保留。
到目前为止,我找到的选项是:

  1. Return forkJoin(concat(...work))在技术上是可行的,因为forkJoin将等待单个concat完成,但它也感觉不对,因为我只给forkJoin一个observable,只是为了等待它完成的副作用,当它专门用于处理多个observable时。
  2. Return concat(...work).pipe(toArray())可能比forkJoin更好,但我仍然觉得我缺少一个更好的操作符。还有takeLast(),它的功能大致相同,但仍然感觉不对,因为它似乎暗示我只关心最后一个值,而我只是想要完成。几乎类似于finalize(),但它会发出,因此它可以用来阻塞流。
    Stackblitz examples here
    有没有更好的操作符来等待concat完成,或者只是一个更好的替代concat的方法,它会按顺序执行observables,让我像forkJoin一样链接结果?感觉就像forkJoin的存在一样,他们有等待多个observables完成的操作符,他们有维护顺序的操作符,必须有一个基本的,我错过了,只是等待一个源observable完成,然后发出
2jcobegt

2jcobegt1#

我不认为您到目前为止提出的解决方案有任何问题,但也许您会发现以下使用concatreduce的解决方案更好地传达了您的意图:

concat(...work).pipe(
    reduce(() => undefined)
);
  • concat表示observables将按顺序执行。
  • reduce在其源发出
  • () => undefined表明您并不真正关心值

StackBlitz演示。

相关问题