2016-04-21 14 views
1

Ich möchte einen Dienst zum Aufrufen einer API haben, die eine Anforderung ordnungsgemäß verarbeitet und die Standardfehlerbehandlung für die API-Anforderungen durchführt. Zum Beispiel habe ich eine ApiErrorsService, die ich aufrufen möchte, wenn ein API-Aufruf einen Fehler erhält. Ich möchte auch Aufrufe auf eine Standard-Weise senden, d. H. Den Inhaltstyp auf Anwendung/json setzen und das Anforderungsobjekt serialisieren.Zweimal bei Angular 2 Http abonnieren?

Natürlich, wenn ich die Observable abonnieren von Http zurückgegeben wird es einmal aufgerufen, und wenn ich es zurück und der Anrufer abonniert es wird erneut aufgerufen. Was wäre der beste Weg, um die Ergebnisse an zwei Orten zu hören, ohne den API-Aufruf zweimal auszuführen? Kann ich einfach .publish() oder .share() anrufen und das zurückgeben? Muss ich es dann entsorgen? Gibt es Timing-Probleme, die auftreten können? Wenn ich den API-Aufruf verspotze und sofort einen Wert zurückgebe, wird das funktionieren, oder wird das Abonnement des Aufrufers die Werte verpassen? Hier ist der Code, den ich habe:

post(path: string, data: any): Observable<Response> { 
    var headers: Headers = new Headers(); 
    headers.set("Content-Type", "application/json"); 
    var s = data == null ? null : JSON.stringify(data, null, 2); 
    var shared = this.http.post(path, s, { headers: headers }).share(); 
    shared.subscribe(null, err => this.appErrorsService.addApiError(err)); 
    return shared; 
} 

Antwort

2

Verwenden share ist Overkill. Wenn Sie den Fehler nur inline verarbeiten möchten, können Sie stattdessen do verwenden:

return this.http.post(path, s, { headers: headers }) 
    .do(null, err => this.appErrorsService.addApiError(err)); 
2

Mit share ist genug, http beobachtbare automatisch vervollständigt, so dass Sie nicht abmelden müssen. Es gibt keine Möglichkeit, Werte zu verpassen, es sei denn, Sie werden den zweiten Listener in der asynchronen Methode (setTimeout/etc) abonnieren.