我有一个动态的对象数组,我需要同步处理。我只会在运行时知道数组中的对象数。处理每个对象包括调用一个方法,该方法在完成其工作时将发出进度通知。每个物体的处理时间会有很大差异(从30-40秒到约5分钟)。
RxJS版本5.5.6
所以基本上,我需要:
(对数组中的所有 n 对象继续。)
我不知道在调用前一项的complete
回调之前,如何让observable等待发出下一个对象。
我看过一堆运算符,而我最接近的运算符是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);
在站点对象中,process
看起来像这样(现在只是一个间隔/超时模拟试图使其工作而不会使实际处理代码复杂化):
process(): Observable<string> {
const obs: Observable<string> = Observable.create((observer: Observer<string>) => {
const int: any = setInterval(() => {
observer.next('downloading ' + this.tag);
}, 500);
setTimeout(() => {
clearInterval(int);
console.log('download done: ' + this.tag);
observer.complete();
}, 2000);
});
return obs;
}
简而言之,我看到了这一点:
...
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
在这种情况下的工作方式,但我仍在努力。