为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript承诺-拒绝与抛出

JavaScript承诺-拒绝与抛出

蓝山帝景 2019-11-05 10:46:22
我已经阅读了几篇有关此主题的文章,但是我仍然不清楚Promise.reject与错误抛出之间是否存在差异。例如,使用Promise.rejectreturn 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它,因为它更短,但我想知道一个相对于另一个是否有任何优势。
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

使用一个相对于另一个没有优势,但是,在特定情况下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。但是,您可以通过通知超时来解决此问题:


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

});


查看完整回答
反对 回复 2019-11-05
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

另一个重要的事实是,reject() DOES NOT像终止控制流return语句一样。相反,throw确实终止了控制流。


例:


new Promise((resolve, reject) => {

  throw "err";

  console.log("NEVER REACHED");

})

.then(() => console.log("RESOLVED"))

.catch(() => console.log("REJECTED"));


new Promise((resolve, reject) => {

  reject(); // resolve() behaves similarly

  console.log("ALWAYS REACHED"); // "REJECTED" will print AFTER this

})

.then(() => console.log("RESOLVED"))

.catch(() => console.log("REJECTED"));


查看完整回答
反对 回复 2019-11-05
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

是的,最大的不同是拒绝是一个在承诺被拒绝后执行的回调函数,而throw不能异步使用。如果您选择使用拒绝,您的代码将继续以异步方式正常运行,而throw将优先完成解析器功能(此功能将立即运行)。


我见过的一个可以帮助我弄清楚问题的示例是,您可以设置带有拒绝的Timeout函数,例如:


new Promise(_, reject) {

 setTimeout(reject, 3000);

});

上面不可能用throw编写。


在您的小示例中,两者之间的区别难以区分,但是当处理更复杂的异步概念时,两者之间的区别可能会非常大。


查看完整回答
反对 回复 2019-11-05
  • 3 回答
  • 0 关注
  • 265 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信