2017-10-12 10 views
0

私は配列から取得するURLに複数の要求をチェーンしたいと思います。次のチェーンの前に、前のものが終了するのを待っています。前回の失敗かどうかは問題ではありません。私はforkJoinでこれを試していましたが、リクエストの1つが失敗した場合はエラーを返します。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

私はVの要素を購読することができないので、私は別の問題を抱えているが、私は 'Observable.concat(... observableBatch).subscribe({ 次のことが必要です= V => { v.subscribe(データ> { this.searchingServer.next(this.dataServers [インデックス]); インデックス++; observer.next(データ); 場合(インデックス== this.dataServers.length){ observer.complete(); 本。 ()=> console.log( "完了") }); '{0} {0} {0} {0} – Stefan

1

あなたはforkJoinでOnErrorResumeNext()を使ってみましたか?あなたの場合、適切なオペレータに

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

しかし、この呼び出しはflatMapの場合と同じように1つずつ実行されますか? – Stefan

関連する問題