これは議論するのに最適なトピックです。残念なことに、これは実際にはネイティブの promise では非常に困難です。
Chrome で生の ES6 promise をデバッグするのは恐ろしいことです。これは、エラーを黙って抑制し、catch を省略するたびに、promise が失敗したことを示すものがないためです。更新: Chrome は未処理の拒否をログに記録するようになりました (方法については、このリンクを参照してください)
Promise.resolve("foo").then(function(){
throw new Error("You will never see this");// silent failure
});
Firefox では、処理されていない拒否の検出を実行するため、状況は少し改善されていますが、それでも不安定であり、promise をどこにでも割り当てた場合は機能しません。
それで、何ができるでしょうか?
Bluebirdを含める- これは ES6 Promise のスーパーセットであり、内部ですぐに交換できます。より豊富な API があり、高速で、驚くべきスタック トレースがあります。デバッグを念頭に置いて構築されており、優れたエラー処理機能が含まれています。
Bluebird を含めたら、次のように呼び出します。
Promise.longStackTraces();
これにより、少し遅くなり (それでも非常に高速になります)、驚くべきエラー メッセージが表示されます。例えば:
Promise.resolve().then(function outer() {
return Promise.resolve().then(function inner() {
return Promise.resolve().then(function evenMoreInner() {
a.b.c.d()
});
});
});
ネイティブの promise では、これはサイレント エラーになり、デバッグが非常に困難になります。Bluebird の promise では、デフォルトでコンソールに大きな赤いエラーが表示されます。
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)
デバッグが完了したら、それを交換して、ネイティブの約束に戻ることができます。個人的には、本番環境にエラーがあることを知っていることを重視しているため、お勧めしませんが、確かに実行可能です。