心当たりのない UnhandledPromiseRejection
/gulpfile を書いてたら、心当たりがないのに UnhandledPromiseRejection とかいう警告が出たのでメモします。
UnhandledPromiseRejection
Promise の Reject が catch されていない( async function なら try...catch されていない)という警告のようです。
処理結果をコンソールの出力で見るタスクだったので、邪魔だし格闘することにしました。
コード
以下のような感じのコードで出ました。
async()=>{
/** awaitを途中で(たとえば何かのイベントで)終わりたい */
const hoge = (origPromise)=>{
let resolve, reject
let promise = new Promise((res.rej)=>{
resolve = res;
reject = rej;
});
origPromise.then(resolve); // ←ここが原因
origPromise.catch(reject);
return {resolve, reject, promise}
}
let {resolve, promise} = hoge(somethingPromise);
something.on("fuga", resolve);
try{
await promise;
...
}catch(e){
...
}
...
}
somethingPromise も promise も catch してるし、特に catch してない Promise に心当たりがありませんでした。
警告にライン番号も出なかったのでどこかよくわかりませんでした。
原因
よく考えたら origPromise.then(resolve)
は新しい Promise で、 origPromise
が reject したら origPromise.then(resolve)
も reject し、これ自体は catch されてないので警告が出ていました。
解決
よって
origPromise.then(resolve); // ←ここが原因
origPromise.catch(reject);
を以下に変更しました。
origPromise.then(resolve, reject);
以下のようでも可のようです。
origPromise.then(resolve).catch(reject);
Promise には気を付けよう!