如何等待所有可观察对象按顺序执行?
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(() => 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));
【讨论】:
以上是关于如何等待所有可观察对象按顺序执行?的主要内容,如果未能解决你的问题,请参考以下文章