异常捕获在功能上是否与承诺错误回调相同

Is an exception catch functionally the same as promise errorCallback?

本文关键字:错误 承诺 回调 调相 是否 功能上 异常      更新时间:2023-09-26

我一直在我的角度应用程序中使用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
}

这仍然有点重复,但不太重复,而更像是一种声明性方法。