2017-10-12 50 views
0

我想鏈接多個請求到我從數組中獲取的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://stackoverflow.com/questions/43336549/如何強制執行可觀察到的執行順序) – martin

回答

1

在你的情況合適的操作者是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

1

您是否嘗試過使用帶有forkJoin的OnErrorResumeNext()?

return Observable.forkJoin(observableBatch) 
.OnErrorResumeNext() 
.subscribe(data => { 
    this.searchingServer.next(null); 
    observer.complete(); 
}); 
+0

但是這個調用與flatMap一樣是一個接一個完成的嗎? – Stefan