Verkettung verspricht mit dann und fangen
Ich bin mit dem bluebird Versprechen-Bibliothek. Ich möchte die Kette verspricht und fangen bestimmte Verheißungen Fehler. Hier ist, was ich Tue :
getSession(sessionId)
.catch(function (err) {
next(new Error('session not found'));
})
.then(function (session) {
return getUser(session.user_id);
})
.catch(function (err) {
next(new Error('user not found'));
})
.then(function (user) {
req.user = user;
next();
});
Aber wenn ein Fehler geworfen wird, durch getSession
die beiden catch
genannt werden, sowie die zweite then
. Ich möchte aufhören, die Fehlerfortpflanzung bei der ersten catch
so dass die zweite catch
wird nur aufgerufen, wenn getUser
wirft, und die zweite then
wenn getUser
gelingt. Was tun?
InformationsquelleAutor der Frage Alexandre Kirszenberg | 2014-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Versprechen, das zurückgegeben wird, durch die
.catch
Methode noch gelöst werden mit der Folge des Rückrufs, nicht nur die Ausbreitung der Kette. Sie müssen entweder Filiale der Kette:oder verwenden Sie die zweite Rückruf
then
:Alternativ, der bessere Weg wäre, einfach nur zu propagieren, die die Fehler durch die Kette, und rufen Sie
next
nur ganz zum Schluss:InformationsquelleAutor der Antwort Bergi
Da Sie mit bluebird für zusagen, die Sie eigentlich gar nicht brauchen, eine catch-Anweisung nach jeder Funktion. Sie können die Kette alle Ihre thens zusammen, und schließen Sie dann die ganze Sache mit einem einzigen catch. So etwas wie dieses:
Vorausgesetzt, die Fehlermeldungen sagen, was der Fehler ist, es ist immer noch möglich, zu senden, ein Fehler, der spezifisch mit der Meldung "session nicht gefunden' oder 'Benutzer nicht gefunden', aber Sie müssen nur einen Blick in die error-Nachricht zu sehen, was es gibt.
Hinweis: ich bin sicher, Sie haben wahrscheinlich ein Grund für den Aufruf weiter, unabhängig davon, ob es ein Fehler ist, oder nicht, aber es könnte nützlich sein, zu werfen, in eine Konsole.error(Fehler) in dem Fall, dass Sie eine Fehlermeldung erhalten. Alternativ können Sie verwenden eine andere Funktion Fehlerbehandlung, ob es eine Konsole.Fehler, oder res.senden(404), oder etwas ähnliches.
InformationsquelleAutor der Antwort Mercury