Global Error-Handler, der nur "unbehandelte" Versprechen abfängt

9

Ich habe einen globalen Fehlerhandler für meine eckige App, der als $http interceptor geschrieben ist, aber ich würde es gerne noch einen Schritt weiter bringen. Was ich möchte ist für jeden $http -Anruf, der fehlschlägt (wird abgelehnt), sollten alle "verketteten" Kunden des Versprechens zuerst versuchen, den Fehler zu beheben, und wenn es noch ungelöst ist (nicht gefangen), dann würde ich wie der globale Fehlerhandler zu übernehmen.

Anwendungsfall ist, mein globaler Fehlerhandler zeigt am oberen Bildschirmrand ein Growl " alert box " an. Aber ich habe ein paar Mods, die auftauchen, und ich behandle die Fehler dort explizit und zeige eine Fehlermeldung im Modal selbst. Im Wesentlichen sollte dieser modale Controller das abgelehnte Versprechen als "behandelt" markieren. Aber da der Interceptor immer der erste zu sein scheint, der auf einem $http error läuft, kann ich keinen Weg finden, dies zu tun.

Hier ist mein Interceptor-Code:

%Vor%

Dies ist ein grober Code, wie ich erwarten würde, dass der Modal-Versprechungs-Call so aussieht:

%Vor%     
Steven M 29.11.2015, 02:55
quelle

1 Antwort

2

1. Lösung (Hacky Way)

Sie können das tun, indem Sie einen Service für Sie erstellen. Da Versprechen kettenfähig sind und Sie auf Controllerebene grundsätzlich eine Eigenschaft handled markieren, sollten Sie dieses Versprechen an Ihren Service weitergeben und sich um die nicht behandelten Fehler kümmern.

%Vor%

2. Lösung (bevorzugte Art)

Oder die bessere Lösung wäre, einen Wrapper für $ http zu erstellen und so etwas zu tun:

%Vor%

Hier wird der myhttp-Serviceaufruf den gegebenen Erfolg und die fehlgeschlagenen Callbacks anwenden und dann kann er seinen eigenen faiden Callback verketten und prüfen, ob die behandelte Eigenschaft wahr oder falsch ist.

Die myhttp-Service-Implementierung (aktualisiert, hinzugefügt setAsHandled -Funktion, die nur optional ist, aber es ist eine bessere Lösung, da es alles an einem Ort (das Attribut 'gehandhabt' leicht änderbar und an einem Ort):

%Vor%

3. Lösung

Wie #2 , aber weniger Code, um dasselbe zu erreichen:

%Vor%

Anderes Beispiel:

%Vor%

Die myhttp-Service-Implementierung:

%Vor%     
Iamisti 03.01.2016 21:58
quelle