使用foreach循环和Observable连接多个调用
我想链接多个请求到我从数组中获取的url。在下一个链条之前,我想等待前一个完成。如果前面的失败没有关系。我试图用forkJoin来做这件事,但我知道如果其中一个请求失败,它会返回错误。使用foreach循环和Observable连接多个调用
this.dataServers.forEach(dataServer => {
observableBatch.push(this.getFoodsByQuery(dataServer.url, query));
});
return Observable.forkJoin(observableBatch).subscribe(data => {
this.searchingServer.next(null);
observer.complete();
});
我不知道如何用flatMap来做到这一点。
在你的情况合适的操作者是concat
串接多个观测量一起通过顺序发射 它们的值,一个接一个的观察到。
实施例:
// Batch of requests
let batch = [
Observable.of(1),
Observable.of(2).delay(1500),
Observable.throw('Error'),
Observable.of(3).delay(300),
Observable.throw('Error again'),
Observable.of(4).delay(600)
];
// Catch (ignore) error of every request
batch = batch.map(obs => {
return obs.catch(err => Observable.of(err));
});
// Concat observables
Observable.concat(...batch).subscribe({
next: v => console.log(v),
complete:() => console.log('Complete')
});
输出:[?如何强制可观测量在顺序执行]
1
2
'Error'
3
'Error again'
4
'Complete'
它看起来不错我编辑了我的问题代码,在这种情况下,我必须订阅v,而我的问题是事实,即在订阅所有内容之前完成解析。 – Stefan
我还有一个问题,因为我不能同意Ⅴ族元素,但我需要 'Observable.concat(... observableBatch).subscribe({ 未来:V => { v.subscribe(数据=> { this.searchingServer.next(this.dataServers [指数]); 指数++; observer.next(数据); 如果(指数== this.dataServers.length){ observer.complete(); 此。 searchingServer.next(null); } }) }, complete:()=> console.log(“complete”) });'' – Stefan
您是否尝试过使用带有forkJoin的OnErrorResumeNext()?
return Observable.forkJoin(observableBatch)
.OnErrorResumeNext()
.subscribe(data => {
this.searchingServer.next(null);
observer.complete();
});
但是这个调用与flatMap一样是一个接一个完成的吗? – Stefan
的可能的复制(https://*.com/questions/43336549/如何强制执行可观察到的执行顺序) – martin