Dies ist ein großartiges Thema, über das man diskutieren kann. Die traurige Nachricht ist, dass dies mit einheimischen Versprechungen ziemlich schwierig ist.
Das Debuggen von rohen ES6-Versprechungen in Chrome ist schrecklich. Dies liegt daran, dass sie Fehler stillschweigend unterdrücken. Wenn Sie einen Fang weglassen, erhalten Sie keinen Hinweis darauf, dass das Versprechen fehlgeschlagen ist. Update: Chrome protokolliert jetzt nicht behandelte Ablehnungen (siehe diesen Link für)
Promise.resolve("foo").then(function(){
throw new Error("You will never see this");
});
In Firefox sind die Dinge etwas besser, da sie eine unbehandelte Ablehnungserkennung durchführen. Es ist jedoch immer noch ein Flakey, und wenn Sie das Versprechen irgendwo vergeben, funktioniert es nicht.
Was kann man also tun?
Bluebird einschließen - es ist eine Obermenge von ES6-Versprechungen und Sie können es direkt austauschen, es hat eine reichhaltigere API, es ist schneller und es hat erstaunliche Stapelspuren . Es wurde mit Blick auf das Debuggen entwickelt und bietet hervorragende Möglichkeiten zur Fehlerbehandlung.
Sobald Sie Bluebird aufgenommen haben, rufen Sie an:
Promise.longStackTraces();
Das wird es etwas verlangsamen (es wird immer noch sehr schnell sein) und Ihnen erstaunliche Fehlermeldungen geben. Zum Beispiel:
Promise.resolve().then(function outer() {
return Promise.resolve().then(function inner() {
return Promise.resolve().then(function evenMoreInner() {
a.b.c.d()
});
});
});
Bei nativen Versprechungen - dies ist ein stiller Fehler und sehr schwer zu debuggen - wird bei Bluebird-Versprechungen standardmäßig ein großer roter Fehler in Ihrer Konsole angezeigt, der Folgendes ergibt:
ReferenceError: a is not defined
at evenMoreInner (<anonymous>:6:13)
From previous event:
at inner (<anonymous>:5:24)
From previous event:
at outer (<anonymous>:4:20)
From previous event:
at <anonymous>:3:9
at Object.InjectedScript._evaluateOn (<anonymous>:581:39)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:540:52)
at Object.InjectedScript.evaluate (<anonymous>:459:21)
Sobald Sie mit dem Debuggen fertig sind, können Sie es austauschen und zu den nativen Versprechungen zurückkehren. Persönlich schätze ich es zu wissen, dass ich Fehler in der Produktion habe, deshalb empfehle ich es nicht, aber es ist auf jeden Fall machbar.
reject('Error')
Aber können Sie eine jsfiddle posten, damit wir etwas Konkretes haben, mit dem wir arbeiten können?