小编典典

JavaScript承诺-拒绝与抛出

javascript

我已经阅读了几篇有关该主题的文章,但是我仍然不清楚是否Promise.reject与抛出错误之间有区别。例如,

使用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它,因为它更短,但我想知道一个相对于另一个是否有任何优势。


阅读 304

收藏
2020-05-01

共1个答案

小编典典

使用一个相对于另一个没有优势,但是,在特定情况下throw无法使用。但是,这些情况可以解决。

每当您进入promise回调时,都可以使用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。但是,您可以通过两种方式解决此问题。

  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!'

    });
2020-05-01