gpt4 book ai didi

javascript - 处理多次调用 AngularJS promise 中的错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:47:28 24 4
gpt4 key购买 nike

我有一个带有这种异步 API 的 AngularJS 服务:

myService.asyncCall(['id0', 'id3', 'id2']).then(function (complexData) {   
// handle complexData
}).catch(function (error) {
console.log(error);
});

asyncCall 封装了 $http 的多个调用,由 $q.all 处理。每个 $http 请求都可以响应错误,我希望错误由一个 catch 处理程序处理。那么我如何才能多次调用 catch 处理程序?

最佳答案

如果我理解正确(最终),这就是您要实现的目标:

  • 输入:
    1. promise list
    2. 当所有 promise 都已解决时调用的回调
    3. 每次任何 promise 被拒绝时调用的回调

  • 行为:
    1. 您想要并行执行(而不是顺序执行)。
    2. 您希望所有 promise 都得到解决或拒绝(即,即使一个 promise 被拒绝,其余的应照常继续)。
    3. 您希望“最终”回调仅被调用一次(接收结果数组 - 无论相应的延迟已解决还是已拒绝)。

$q.all 应该“增强”以满足您的需求,因为默认情况下:

  1. 一旦列表中的任何 promise 被拒绝,它就会立即被拒绝。
  2. 如果被拒绝,它只返回拒绝原因,结果列表。

这是一个可能的实现:

function asyncCall(listOfPromises, onErrorCallback, finalCallback) {

listOfPromises = listOfPromises || [];
onErrorCallback = onErrorCallback || angular.noop;
finalCallback = finalCallback || angular.noop;

// Create a new list of promises that can "recover" from rejection
var newListOfPromises = listOfPromises.map(function (promise) {
return promise.catch(function (reason) {

// First call the `onErrroCallback`
onErrorCallback(reason);

// Change the returned value to indicate that it was rejected
// Based on the type of `reason` you might need to change this
// (e.g. if `reason` is an object, add a `rejected` property)
return 'rejected:' + reason;

});
});

// Finally, we create a "collective" promise that calls `finalCallback` when resolved.
// Thanks to our modifications, it will never get rejected !
$q.all(newListOfPromises).then(finalCallback);
}

另请参阅此 short demo .

关于javascript - 处理多次调用 AngularJS promise 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23366626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com