异常捕获在功能上是否与承诺错误回调相同
Is an exception catch functionally the same as promise errorCallback?
我一直在我的角度应用程序中使用javascript promsis,但我厌倦了为每个承诺重复相同的errorCallback。我正在考虑简单地将承诺包装在 try/catch 块中,并让 catch 块处理任何承诺失败。
这让我问了一个问题 - 如果错误回调位于 try/catch 块中,它们是否是多余的?javascript会"捕获"错误失败吗?
编辑:添加代码以反映我计划如何执行此操作:
try {
$http.post().success(callback);
}(catch)
{
}
同:
$http.post().succes(callback()).error(callback)
不,它不会。原因是您实际执行的是将回调函数排队,以便在请求获得成功的异步响应时调用。到那时,执行将越过您的try/catch
块,并且您将收到一个未处理的错误。
另一种看待它的方法是,同步抛出的错误会立即沿着调用树传播到最近的 catch 块,而异步错误结果只能通过延迟对象处理。
如果您希望为多个基于 promise 的异步操作调用相同的错误处理程序,则有多种方法可以做到这一点。最明显的是将$q
注入控制器并执行以下操作:
var deferred1 = $http.get(...);
var deferred2 = someOtherPromiseBasedMethod(...);
$q.all([deferred1, deferred2, ..., deferredN])
.then(null, function (rejection) {
// first failed deferred will provide the rejection value here
});
另一种方法是创建一个包装函数:
function handleError(deferred) {
return deferred.then(null, commonErrorHandler);
}
handleError($http.get(...)).then(function (result) {
// Handle the success case here
}
这仍然有点重复,但不太重复,而更像是一种声明性方法。
相关文章:
- React JS:未捕获(在承诺中)语法错误:在位置 0 的 JSON 中意外<令牌
- 承诺-如何正确地将错误附加到此示例
- 我能处理来自gap.client.load'的错误吗;的承诺
- $q.reject和处理AngularJS链接承诺中的错误
- 如何在使用替代承诺时解释 ajax 调用中的错误
- 处理角度.js承诺错误状态
- 为什么承诺会捕获语法错误
- Chai正如承诺:当承诺抛出错误时,处理错误
- 如何创建角度承诺中捕获的错误
- 停止蓝鸟承诺中的错误传播
- 当我在异步操作Redux上开始单元测试时,没有定义错误承诺
- 为什么在Chrome上忽略被拒绝的承诺是错误的
- 抓住柴和承诺的错误
- 如何链接javascript承诺和错误
- 在第一次错误回调时退出承诺链
- 如何调试错误:;未捕获(承诺中)缺少参数单元”;
- JS bluebird承诺错误没有给出任何细节
- Shopify Buy JS SDK在IE 11上抛出错误—承诺未定义
- 如何调试“错误:承诺被拒绝,无理由或虚假理由”;在摩卡测试中
- 多个承诺错误(承诺必须通过new构造)