プロミスは拒否された後で「処理」できます。つまり、キャッチハンドラを提供する前に、promiseの拒否コールバックを呼び出すことができます。書くことができるので、この動作は私にとって少し面倒です...
var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });
...そしてこの場合、約束は黙って拒否されます。キャッチハンドラの追加を忘れた場合、コードはエラーなしで静かに実行され続けます。これは、長引くバグや見つけにくいバグにつながる可能性があります。
Node.jsの場合、これらの未処理のPromise拒否の処理と問題の報告についての話があります。これにより、ES7 async / awaitが表示されます。この例を考えてみましょう:
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
let temp = await tempPromise;
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
await changeClothes("warm");
} else {
await changeClothes("cold");
}
await teethPromise;
}
上記の例では、getRoomTemperatureが実行される前に、teethPromiseが拒否された(エラー:歯磨き粉がなくなった!)とします。この場合、toothPromiseを待つまで、未処理のPromise拒否があります。
私のポイントはこれです...未処理のPromise拒否が問題であると考えると、後でawaitによって処理されたPromiseが誤ってバグとして報告される可能性があります。繰り返しになりますが、未処理のPromise拒否が問題にならないと考えると、正当なバグが報告されない可能性があります。
これについての考え?
これは、Node.jsプロジェクトの次のディスカッションに関連しています。
デフォルトの未処理の拒否検出動作
この方法でコードを記述した場合:
function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
return Promise.resolve(tempPromise)
.then(temp => {
// Assume `changeClothes` also returns a Promise
if (temp > 20) {
return Promise.resolve(changeClothes("warm"));
} else {
return Promise.resolve(changeClothes("cold"));
}
})
.then(teethPromise)
.then(Promise.resolve()); // since the async function returns nothing, ensure it's a resolved promise for `undefined`, unless it's previously rejected
}
getReadyForBedが呼び出されると、同期的に最終的な(返されない)プロミスが作成されます-これは、他のプロミスと同じ「未処理の拒否」エラーになります(もちろん、エンジンによっては何もない場合もあります)。(私はあなたの関数が何も返さないのは非常に奇妙です、それはあなたの非同期関数が未定義のための約束を生み出すことを意味します。
キャッチせずに今すぐPromiseを作成し、後で追加すると、ほとんどの「未処理の拒否エラー」実装は、後で処理するときに実際に警告を撤回します。言い換えれば、async / awaitは、「処理できない拒否」の議論を私が見ることができる方法で変更することはありません。
この落とし穴を回避するには、次のようにコードを記述してください。
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
var clothesPromise = tempPromise.then(function(temp) {
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
return changeClothes("warm");
} else {
return changeClothes("cold");
}
});
/* Note that clothesPromise resolves to the result of `changeClothes`
due to Promise "chaining" magic. */
// Combine promises and await them both
await Promise.all(teethPromise, clothesPromise);
}
これにより、未処理の約束の拒否が防止されます。