如何等待所有可观察对象按顺序执行?

Posted

技术标签:

【中文标题】如何等待所有可观察对象按顺序执行?【英文标题】:How do I wait for all observables to execute sequentially? 【发布时间】:2018-05-28 18:09:56 【问题描述】:

我知道 forkJoin 将等待所有可观察对象触发,但我需要这些可观察对象按顺序触发。我可能对concat的用法有误解,但我们的代码或多或少是这样的:

const observables: Observable<ArrayBuffer>[] = [];

  observables.push(
    Observable.fromPromise(this.file.readAsArrayBuffer(directoryPath, filePath))
      .map((arrayBuffer) => 
        // work done here on "object", name obsfucated for client reasons
        return arrayBuffer;
      ,
    ),
  );
);

return Observable.concat(observables).map((arrayBuffers) => 
  //we return "object" from here that's also obfuscated for client reasons
);

这是错的吗?这不会按顺序开火吗?我们一直遇到问题。

【问题讨论】:

在我使用 rx 时,我只能通过将 observables 分开,然后在 onNext 部分 subscribe 到序列中的下一个 observable 来做到这一点。 你一直有什么问题? 你可能想阅读这篇文章Learn to combine RxJs sequences with super intuitive interactive diagrams 【参考方案1】:

promise 是急切的,所以总是会直接开始执行。您可以通过将其包装在 Observable.defer(() =&gt; myPromise()) 中来推迟此操作。

如果您首先要创建一个 observable 数组,然后希望按顺序执行,您可以使用 .concatMap().concatAll()

const myObsArray = [];
myObsArray.push(Observable.defer(() => Promise.resolve(1));
myObsArray.push(Observable.defer(() => Promise.resolve(2));

Observable.from(myObsArray).concatAll().subscribe(val => console.log(val));

【讨论】:

以上是关于如何等待所有可观察对象按顺序执行?的主要内容,如果未能解决你的问题,请参考以下文章

带有可观察对象的任务队列[关闭]

MFC中如何让多线程按先后顺序执行,第一个来的先执行,以后按先后到达的顺序执行

来自数组的 RxSwift 可观察对象序列

如何按顺序执行javascript代码?

SQL存储过程等待并按顺序执行

如何按顺序执行承诺并返回所有结果[重复]