2016-05-31 10 views
0

ich erstelle einen HttpClient für meine Angular2 typescript app und ich bin in Fehlerhandler stecken.Wie kann ich eine Methode außerhalb von Rxjs Observable ausführen, wenn ich den Angular2 HTTP Client erweitere?

Ich möchte ein Ereignis ausgeben, wenn ich einen Fehler 401 abfange, und ich bin in der Lage, den Fehler zu erfassen, aber nicht mein Ereignis auszulösen, weil das .catch an eine Funktion des Typs Observable, also ich angefügt werden muss habe keinen Zugriff auf meine HttpClient Class dieses Scope.

errorHandler (error:any) : Observable<any> { 
 
    if(error.status == 401) { 
 
    // I want to call this.myOtherMethod() here! 
 
    this.events.publish('token_expired'); // Will throw this.events is undefined 
 
    console.log(error); 
 
    } 
 

 
    return Observable.throw(error.json()); 
 
} 
 

 
get(url) : Observable<any> { 
 
    return this.http.get(url, { 
 
    headers: this.customHeaders 
 
    }).catch(this.errorHandler); 
 
}

So weiß ich, dass ich meine this.events aus dem Inneren dieser Funktion zugreifen kann nicht, aber was ist die Abhilfe? Wie kann ich die Veranstaltungen dort einspeisen?

Antwort

1

Das Problem ist, dass Sie die errorHandler Methode verweisen, so dass Sie den Wert des this Schlüsselwort verlieren. So funktioniert JavaScript.

könnten Sie versuchen, die folgenden von diesem zu verhindern:

get(url) : Observable<any> { 
    return this.http.get(url, { 
    headers: this.customHeaders 
    }).catch((error:any) => { 
    return this.errorHandler(error); 
    }); 
} 

oder

get(url) : Observable<any> { 
    return this.http.get(url, { 
    headers: this.customHeaders 
    }).catch(this.errorHandler.bind(this)); 
} 

Sie müssen sich der Nachteil, wenn die bind Methode mit Typoskript mit:

+0

Perfekt beantwortet! Lief wie am Schnürchen. Ich war viel zu besorgt wegen des Funktionstyps und ich bemerkte nicht, dass der Oszilloskopfotiv die Referenz löschte. Danke! Als gelöst markiert. – gfviegas