4) コンストラクタに渡した関数内で発生したエラー
Promiseの処理はtry…catchと同等
コンストラクタには渡したコールバック関数内はtry...catch
と同じ動作をします。
var promise = new Promise(function(resolve, reject){
throw new Error('unexpected');
});
promise.then(
function(value){
console.info(value);
},
function(error){
// 'unexpected'
console.info(error);
}
);
コールバック関数内のエラーはブラウザのエラーになりません。暗黙のうちに rejected として処理されます。 このため rejected には「処理が失敗した」状態だけでなく、エラーも渡される事を前提とした処理を書く必要があります。
catch
rejected はthen()
の第二引数の代わりに、catch
を使って受け取る事もできます。
var promise = new Promise(function(resolve, reject){
reject(new Error('abort'));
});
promise
.then(function(){
})
.catch(function(error){
console.log(error.message);
})
;
処理の失敗はreject()する
コールバック関数内ではreject()
throw new Error()
のどちらも rejected として扱われます。
意図的に rejected な状態にするにはどちらを使えば良いのでしょうか?
function task(){
return new Promise(function(resolve, reject){
// rejectする
reject(new Error('reason'));
// rejectとして扱われる
throw new Error('reason');
});
}
ブラウザのデバッガでエラー発生時に停止させるオプションを使っている場合は、それが意図的なものか、そうでないかを判別できません。(参考:Chromeでエラー発生時に一時停止する)
このような理由により rejected な状態にする時はthrow
ではなくreject()
を使う方法が推奨されます。