好的,假设我有一系列 n XHR请求:
var promises = [];
var AllResults = [];
$scope.requests = [
{
"uri":"http://foo/bar/action1",
"name":"Action1"
},{
"uri":"http://bar/foo/action2",
"name":"Action2"
},{...},{...},{...}
];
var ParseMyResultsArray = function(){
console.log(AllResults);
//...
};
angular.forEach($scope.requests, function(request){
var promise = $http.get(request.uri);
promises.push(promise);
});
angular.forEach(promises, function(promise){
promise.then(function(results){
AllResults.push(results);
});
});
//Then, when all promise are resolved...
ParseMyResultsArray();
如果在不知道ParseMyResultsArray()
数组的大小的情况下解决了所有承诺,我怎么能确定致电requests
?
感谢您的帮助!
答案 0 :(得分:17)
从有角度的文档到$http:
$ http API基于$ q公开的延迟/承诺API 服务。
因此可以使用$q.all()方法来获取一系列承诺,并且:
将多个承诺组合到一个单独的承诺中,该承诺在何时解决 所有输入承诺都已解决
实施代码是:
$q.all(promises).then(function () { /* All promises are resolved */ });
答案 1 :(得分:8)
我知道这个问题已经过了一年多了,但值得更好的答案。
代码可以更加简洁,可以避免丑陋的外部变量promises
和AllResults
以及外部函数ParseMyResultsArray()
。
尝试......
$scope.requests = [{
"uri":"http://foo/bar/action1",
"name":"Action1"
}, {
"uri":"http://bar/foo/action2",
"name":"Action2"
},{...},{...},{...
}];
$q.all($scope.requests.map(function(request) {
return $http.get(request.uri);
})).then(function(results) {
console.log(results);
//parse results array here ...
return parsedResults;
});
如果需要进一步访问parsedResults
,则一定要保留(或返回)对$q.all(...).then(...)
返回的承诺的引用。由于获取数据所涉及的异步性,parsedResults 的承诺将比原始外部变量AllResults
更有用。