1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptのプロミス - reject vs. throw

2022-05-05 16:48:39

質問

このテーマに関する記事をいくつか読みましたが、以下の違いがあるのかどうか、私にはまだよくわかりません。 Promise.reject vs. エラーを投げる。例えば

Promise.rejectを使用する

return asyncIsPermitted()
    .then(function(result) {
        if (result === true) {
            return true;
        }
        else {
            return Promise.reject(new PermissionDenied());
        }
    });

スローの使用

return asyncIsPermitted()
    .then(function(result) {
        if (result === true) {
            return true;
        }
        else {
            throw new PermissionDenied();
        }
    });

私の好みは throw 単純に短いという理由だけですが、どちらかの利点があるのかどうか気になります。

解決方法は?

どちらを使っても利点はないのですが、特定のケースで throw は機能しません。しかし、それらのケースは修正することができます。

プロミスのコールバック内では、いつでも throw . しかし、他の非同期コールバックの中にいる場合は、必ず reject .

例えば、これではキャッチが発動しません。

new Promise(function() {
  setTimeout(function() {
    throw 'or nah';
    // return Promise.reject('or nah'); also won't work
  }, 1000);
}).catch(function(e) {
  console.log(e); // doesn't happen
});

その代わり、未解決のプロミスとキャッチされない例外が残ります。 このような場合は、代わりに reject . しかし、2つの方法でこれを解決することができます。

  1. のように、タイムアウトの内部で元のPromiseのreject関数を使用することです。

new Promise(function(resolve, reject) {
  setTimeout(function() {
    reject('or nah');
  }, 1000);
}).catch(function(e) {
  console.log(e); // works!
});

  1. タイムアウトを約束することで

function timeout(duration) { // Thanks joews
  return new Promise(function(resolve) {
    setTimeout(resolve, duration);
  });
}

timeout(1000).then(function() {
  throw 'worky!';
  // return Promise.reject('worky'); also works
}).catch(function(e) {
  console.log(e); // 'worky!'
});