目次へ戻る


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);
  }
);

plunker

コールバック関数内のエラーはブラウザのエラーになりません。暗黙のうちに rejected として処理されます。 このため rejected には「処理が失敗した」状態だけでなく、エラーも渡される事を前提とした処理を書く必要があります。

catch

rejectedthen()の第二引数の代わりに、catchを使って受け取る事もできます。

var promise = new Promise(function(resolve, reject){
  reject(new Error('abort'));
});

promise
  .then(function(){
  })
  .catch(function(error){
    console.log(error.message);
  })
;

plunker

処理の失敗は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()を使う方法が推奨されます。


前のページ 次のページ