一个异常catch在功能上与promise errorCallback相同吗?

时间:2014-10-24 17:17:40

标签: javascript promise angular-promise

我一直在使用javascript promsises尽管我的角度应用程序,但我厌倦了为每个承诺重复相同的errorCallback。我正在考虑简单地将一个promise包装在try / catch块中,并让catch块处理任何promise失败。

这导致我提出问题 - 如果错误回调是在try / catch块中,那么错误回调是多余的吗? javascript会“抓住”错误失败吗?

编辑:添加代码以反映我计划如何执行此操作:

try {
  $http.post().success(callback); 
}(catch)
{
}

与:

相同
$http.post().succes(callback()).error(callback)

1 个答案:

答案 0 :(得分:1)

不,它不会。原因是您实际执行的操作是在请求获得成功的异步响应时将您的回调函数排队。到那时,执行将超过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
}

这仍然有点重复,但不那么重要,而更像是一种陈述性方法。