2017-05-20 1 views
0

Ich habe den folgenden Code in canActivate Methode des AuthGuard:Re-Wurf-Fehler von Observable.catch in AuthGuard canActivate

return this.http.get(url) 
 
    .map(res => { 
 
    console.log(res.json()); 
 
    return true; 
 
    }) 
 
    .catch(error => { 
 
    return Observable.throw(error); 
 
    // return Observable.of(false); 
 
    });

Wenn ich die Observable.of(false) Linie Kommentar-, alles ist gut. Allerdings möchte ich nicht nur falsch in einem Observable eingewickelt zurückgeben, ich möchte auch den Fehler erneut werfen, so dass meine globale benutzerdefinierte ErrorHandler es fangen und eine benutzerfreundliche Nachricht anzeigen würde.

+0

No tun können. 'CanActivate' hat eine Schnittstelle von' Observable | Versprechen | Boolean 'Alles andere ist ein Kompilierungsfehler, und zwar deshalb, weil der Code, der die Methode" konsumiert ", nur einen logischen Wert erwartet. –

+0

Was Sie "tun" können, ist in einen anderen Dienst verdrahten und Logik enthalten, um den Fehler dort zu senden. Dann können Sie diesen Fehler entweder innerhalb der Servicelogik behandeln oder in ähnlicher Weise eine Observable für etwas ausgeben, das konsumiert und auf die Daten reagiert. –

+0

Sorry, ich bin mir nicht sicher, ob ich folge. Wäre das auch in der "Fang" -Funktion? – Sammy

Antwort

0

Sie können dies tun:

Observable.throw('error') 
    .catch(error => { 
     return Observable.throw(error).startWith(false); 
    }) 
    .subscribe(
     value => console.log('Next', value), 
     err => console.log('Error', err) 
    ); 

die beobachtbaren kehrte von catch() ist nur eine ganz normale beobachtbare die Fehler als auch werfen können.

Beachten Sie, dass Sie den Fehlerrückruf in subscribe() einstellen müssen, andernfalls würde der Fehler erneut ausgelöst werden.

Diese Demo gibt die folgende Ausgabe:

Next: false 
Error: error 
+0

Danke! Kann ich das tun, ohne überhaupt zu abonnieren? Ich frage seit ich Observer an canActivate in erster Linie zurückgeben. – Sammy

+0

Sie müssen irgendwo abonnieren, ich denke canActivate abonniert sich selbst, aber ich habe es nie selbst verwendet, so kann ich nicht sagen. – martin

Verwandte Themen