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


蓝山帝景
浏览 266回答 3
3回答

九州编程

使用一个相对于另一个没有优势,但是,在特定情况下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!'});

幕布斯6054654

另一个重要的事实是,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"));

一只甜甜圈

是的,最大的不同是拒绝是一个在承诺被拒绝后执行的回调函数,而throw不能异步使用。如果您选择使用拒绝,您的代码将继续以异步方式正常运行,而throw将优先完成解析器功能(此功能将立即运行)。我见过的一个可以帮助我弄清楚问题的示例是,您可以设置带有拒绝的Timeout函数,例如:new Promise(_, reject) { setTimeout(reject, 3000);});上面不可能用throw编写。在您的小示例中,两者之间的区别难以区分,但是当处理更复杂的异步概念时,两者之间的区别可能会非常大。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript