【发布时间】:2016-01-31 10:27:04
【问题描述】:
我已经阅读了几篇关于这个主题的文章,但我仍然不清楚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,只是因为它更短,但我想知道其中一个是否比另一个有优势。
【问题讨论】:
-
两种方法产生完全相同的响应。
.then()处理程序捕获抛出的异常并自动将其转换为被拒绝的承诺。由于我已经读过抛出的异常执行起来并不是特别快,我猜想返回被拒绝的承诺可能会稍微快一点执行,但如果知道这一点很重要,你必须在多个现代浏览器中设计一个测试。我个人使用throw,因为我喜欢可读性。 -
@webduvet 不与 Promises 一起使用 - 它们旨在与 throw 一起使用。
-
throw的一个缺点是,如果它是从异步回调(例如 setTimeout)中抛出的,它不会导致被拒绝的承诺。 jsfiddle.net/m07van33@Blondie 你的答案是正确的。 -
@KevinB 是的。出于这种原因,我认为最好用 Promises 替换所有异步回调。您可以从 Promisified 超时中抛出:jsbin.com/mebogukele/edit?js,console
-
啊,真的。因此,对我的评论的澄清是,“如果它是从异步回调中抛出的,没有被承诺”。我知道有一个例外,我只是不记得它是什么。我也更喜欢使用 throw 只是因为我发现它更具可读性,并且允许我从我的参数列表中省略
reject它。
标签: javascript promise