2016-06-27 3 views
11

Ist es möglich, forkjoin http.get-Anforderungen fortzusetzen, selbst wenn eine der Anforderungen fehlschlägt.angular2 rxjs beobachtbares forkjoin

Ich freue mich auf eine ähnliche Funktion von $ q.allSettled in angular2.

Siehe Beispiel: 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; 
    }); 
}); 

Kab

Antwort

6

Verwendet Observable.forkJoin() mehrere gleichzeitige http.get() -Anforderungen zu laufen. Der gesamte Vorgang führt zu einem Fehlerzustand, wenn eine einzelne Anforderung fehlschlägt.

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()) 
    ); 

Aber Sie könnten Ihre zusätzliche GET-Anforderung in den Fehler-Handler setzen:

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

Vielen Dank für die Antwort, können Sie ein Beispiel nennen? – kabus

+6

downvote, weil dies die Frage des OPs nicht löst, wie die Anforderungen fortgesetzt werden, wenn einer von ihnen fehlschlägt. Gilt forkJoin für den Abschluss nicht fehlgeschlagener Anfragen oder schlägt es selbst fehl? – corolla

+0

@AngJobs Gibt es eine Möglichkeit, die Fehler für jedes Array-Element zu behandeln? Ich muss die Benutzeroberfläche mit einer Fehlermeldung für das bestimmte Element aktualisieren, das fehlschlägt. Ich habe nach dem res: -Block ein (err) => {} hinzugefügt, aber es springt nur zum endgültigen Fehler für das gesamte Array –

24

Sie könnten den catch Operator für jede beobachtbare nutzen, um die Fehler abzufangen und andere beobachtbare in solchen Fällen zurück. Hier

ist ein Beispiel:

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({}), 
);