2016-06-27 20 views
11

要求の1つが失敗してもforkjoin http.get要求を続けることは可能ですか?angular2 rxjs observable forkjoin

angle2の$ q.allSettledと同様の機能があります。

は、例を参照してください:http://jsfiddle.net/Zenuka/pHEf9/

angular.module('qAllSettled', []).config(function($provide) { 
    $provide.decorator('$q', function($delegate) { 
    var $q = $delegate; 
    $q.allSettled = function(promises) { 
     return $q.all(promises.map(function(promise) { 
     return promise.then(function(value) { 
      return { state: 'fulfilled', value: value }; 
     }, function(reason) { 
      return { state: 'rejected', reason: reason }; 
     }); 
     })); 
    }; 
    return $q; 
    }); 
}); 

答えて

6

は、複数の同時http.get()要求を実行するために)(Observable.forkJoin使用します。 単一の要求が失敗した場合、操作全体がエラー状態になります。

getBooksAndMovies() { 
    return Observable.forkJoin(
     this.http.get('/app/books.json').map((res:Response) => res.json()), 
     this.http.get('/app/movies.json').map((res:Response) => res.json()) 
    ); 

しかし、あなたはエラーハンドラでの追加のGET要求を入れることができます:

getBooksAndMovies() { 
    Observable.forkJoin(
     this.http.get('/app/books.json').map((res:Response) => res.json()), 
     this.http.get('/app/movies.json').map((res:Response) => res.json()) 
    ).subscribe(
     data => { 
     this.books = data[0] 
     this.movies = data[1] 
     }, 
     err => console.error(err) 
    ); 
+0

おかげで、あなたは例を提供することができますか? – kabus

+6

downvoteこれは、いずれかが失敗した場合にリクエストを続行する方法に関するOPの質問を解決しないためです。 forkJoinは失敗していないリクエストの完了を待つか、すぐに失敗するか? – corolla

+0

@AngJobs各配列要素のエラーを処理する方法はありますか?失敗した特定の要素のエラーメッセージでUIを更新する必要があります。 res:ブロックの後に(err)=> {}を追加しましたが、配列全体の最後の失敗にジャンプします –

24

あなたがエラーを傍受し、そのような場合には、別の観測可能を返すために、各観測可能なためcatchオペレータを活用することができます。ここで

はサンプルです:応答のための

return Observable.forkJoin(
    this.http.get('/some-url') 
     .map((res:Response) => res.json()) 
     .catch(res:Response => Observable.of({}), 
    this.http.get('/some-other-url') 
     .map((res:Response) => res.json()) 
     .catch(res:Response => Observable.of({}), 
); 
関連する問題