使用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来做到这一点。

+0

的可能的复制(https://*.com/questions/43336549/如何强制执行可观察到的执行顺序) – martin

在你的情况合适的操作者是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' 
+0

它看起来不错我编辑了我的问题代码,在这种情况下,我必须订阅v,而我的问题是事实,即在订阅所有内容之前完成解析。 – Stefan

+0

我还有一个问题,因为我不能同意Ⅴ族元素,但我需要 '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(); 
}); 
+0

但是这个调用与flatMap一样是一个接一个完成的吗? – Stefan