我正在并行执行多个$http
调用(异步)。我的代码逻辑看起来像这样 -
$scope.ids = [1, 2, 3, 4];
var promises = [];
for(var i in $scope.ids){
promises.push(
$http.get('http://0.0.0.0/t2/' + $scope.ids[i])
);
}
$q.all(promises).then(
function(res){
console.log(res);
},
function(res){
console.log(res);
}
);
现在$q.all()
文档说明了
返回将使用数组/散列解析的单个promise 值,每个值对应于相同索引/键的promise 在promises数组/哈希中。如果任何承诺通过a解决 拒绝,由此产生的承诺将被拒绝 拒绝价值。
现在,当所有的promise都通过时,我得到一个包含4个元素的数组的预期响应。
成功 - >对象[4]
但是,在所有失败的情况下,res
输出仅显示失败的输出。
失败 - >散列
这是预期的,以及Angular Docs提到的内容。
在我的情况下,我想知道我所做的所有http请求的状态,即使它是一个失败我需要结果。肯定$ q.all()会在承诺失败的那一刻爆发。我想等到所有承诺都通过或失败然后得到结果。我该怎么做?
答案 0 :(得分:2)
一个想法是利用promise的错误回调来返回有意义的状态:
function Failure(r) {
this.response = r;
}
$scope.ids = [1, 2, 3, 4];
var promises = [];
for(var i in $scope.ids){
promises.push(
$http.get('http://0.0.0.0/t2/' + $scope.ids[i]).then(
function(r) {
return r;
},
function failure(r) {
// this will resolve the promise successfully (so that $q.all
// can continue), wrapping the response in an object that signals
// the fact that there was an error
return new Failure(r);
}
);
);
}
现在$q.all()
将始终成功,返回结果数组。使用result[i] instanceof Failure
检查每个结果。如果此条件为真,则该请求失败 - 获取响应result[i].response
。 IT可能需要一些调整,但希望你明白这一点。