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!'
});
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"));
TA贡献1836条经验 获得超5个赞
是的,最大的不同是拒绝是一个在承诺被拒绝后执行的回调函数,而throw不能异步使用。如果您选择使用拒绝,您的代码将继续以异步方式正常运行,而throw将优先完成解析器功能(此功能将立即运行)。
我见过的一个可以帮助我弄清楚问题的示例是,您可以设置带有拒绝的Timeout函数,例如:
new Promise(_, reject) {
setTimeout(reject, 3000);
});
上面不可能用throw编写。
在您的小示例中,两者之间的区别难以区分,但是当处理更复杂的异步概念时,两者之间的区别可能会非常大。
添加回答
举报