JavaScript Promises - 拒否とスロー 質問する

JavaScript Promises - 拒否とスロー 質問する

この件についてはいくつかの記事を読みましたが、エラーをスローすることとの違いがまだよくわかりませんPromise.reject。たとえば、

Promise.reject の使用

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

throwの使用

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

私は単純に短いのでそれを使用することを好みますthrowが、どちらか一方が他方よりも優れている点があるかどうか疑問に思っています。

ベストアンサー1

どちらか一方を使用する利点はありませんが、throw動作しない特定のケースがあります。ただし、これらのケースは修正できます。

プロミス コールバック内ではいつでも を使用できますthrow。ただし、その他の非同期コールバック内では を使用する必要がありますreject

たとえば、次の場合、catch はトリガーされません。

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 の拒否関数を使用します。

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

おすすめ記事