RxJS可观测在上一个完成时发出
我有一个需要同步处理的动态对象数组。在运行时,我只知道数组中的对象数。处理每个对象包括调用一个方法,该方法将在完成其工作时发出进度通知。每个对象的处理时间会有很大差异(从30-40秒到~5分钟) RxJS版本5.5.6 所以基本上,我需要:RxJS可观测在上一个完成时发出,rxjs,Rxjs,我有一个需要同步处理的动态对象数组。在运行时,我只知道数组中的对象数。处理每个对象包括调用一个方法,该方法将在完成其工作时发出进度通知。每个对象的处理时间会有很大差异(从30-40秒到~5分钟) RxJS版本5.5.6 所以基本上,我需要: 发射对象1 进程对象1 发射对象2 进程对象2 (对数组中的所有n个对象继续) 我不知道如何让observable等待发出下一个对象,直到调用前一项的complete回调 我看了很多运营商,最近的一个是merge,但它仍然同时处理所有站点。以下是我的代码当前
complete
回调
我看了很多运营商,最近的一个是merge
,但它仍然同时处理所有站点。以下是我的代码当前的位置:
为我服务:
const allObs: Array<Observable<string>> = [];
const siteObserver: Observer<string> = {
next: (s: string) => console.log(s),
error: (error: string) => {},
complete: () => console.log('complete')
};
activeSites.map((site: MatchSite) => {
const obs: Observable<string> = Observable.create((masterObserver: Observer<string>) => {
site.process().subscribe((x: string) => console.log(x));
masterObserver.next(site.tag + ' processing');
});
allObs.push(obs);
});
const all: any = Rx.Observable.merge(...allObs);
const sub: Subscription = all.subscribe(siteObserver);
简而言之,我看到了:
...
downloading siteA
downloading siteB
downloading siteC
downloading siteD
downloading siteA
downloading siteB
downloading siteC
downloading siteD
...
我想要的是:
...
downloading siteA
downloading siteA
downloading siteB
downloading siteB
downloading siteC
downloading siteC
downloading siteD
downloading siteD
...
有人能给我指一下正确的方向吗
谢谢
TTE
更新
当我将并发性1添加到merge
或使用concat
时,第一个站点将被处理两次,而不会处理其他站点。现在我真的很困惑
我不知道
flatMap
在这种情况下如何工作,但我仍在努力。使用concat
而不是merge
。或者在对merge
的调用中指定一个concurrency
——这就是concat
的实现方式。基于第一段,我建议基于数组创建一个流,并使用flatMap
。我觉得你的方法很混乱,所以我可能遗漏了什么。
...
downloading siteA
downloading siteA
downloading siteB
downloading siteB
downloading siteC
downloading siteC
downloading siteD
downloading siteD
...