异常捕获在功能上是否与 promise errorCallback 相同?

分享于2023年05月08日 angular-promise javascript promise 问答
【问题标题】:Is an exception catch functionally the same as promise errorCallback?异常捕获在功能上是否与 promise errorCallback 相同?
【发布时间】:2023-05-07 05:28:01
【问题描述】:

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

这导致我提出这个问题 - 如果错误回调位于 try/catch 块中,它们是否是多余的? javascript会“捕获”错误失败吗?

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

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

同:

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

  • 请显示您询问的具体代码。异常与 Promise 失败不同,并且异常本身不会从异步回调中传播。这只能在您询问具体代码时才能回答。
  • 您还应该提及您正在使用哪个承诺库,因为不同的库具有不同的功能来处理承诺处理程序中的异常。
  • 添加了我的代码。使用基于 angulars $q 的 angulars $http。还没有决定我应该使用哪一个
  • 你真的不是说 $http.post().success(callback); callback 后面没有括号吗?
  • @jfriend00 已更正。

【解决方案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
}

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

【讨论】: