JavaScript承诺 – 拒绝与抛出

我已经阅读了这个主题的几篇文章,但是仍然不清楚,如果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只是因为它更短,但想知道是否有一个优于另一个。

最佳答案
没有使用一个vs的优势,但是,有一个特定的情况下,抛出不工作。但是,这些情况可以固定。

任何时候你在一个promise回调,你可以使用throw。然而,如果你在任何其他类型的回调,你必须使用拒绝。

例如,

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

不会触发catch,而是留下未解决的promise和未捕获的异常。这是一种情况,你想改为使用拒绝。然而,你可以通过承诺超时来解决这个问题:

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

转载注明原文:JavaScript承诺 – 拒绝与抛出 - 代码日志