好吧,假设我有一系列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();
Run Code Online (Sandbox Code Playgroud)
ParseMyResultsArray()如果在不知道requests阵列大小的情况下解决所有承诺,我怎么能确定打电话?
谢谢你的帮助!
Dmi*_*eev 17
从angular docs到$ http:
$ http API基于$ q服务公开的延迟/承诺API.
因此,可以使用$ q.all()方法,该方法接受一系列promise和:
将多个promises组合成一个promise,在解决所有输入promise时解析
实现代码是:
$q.all(promises).then(function () { /* All promises are resolved */ });
Run Code Online (Sandbox Code Playgroud)
我知道这个问题已经有一年多了,但值得更好的回答.
该代码可以是远更简洁和丑陋外VARS 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;
});
Run Code Online (Sandbox Code Playgroud)
如果需要进一步访问parsedResults,则通过一切手段保留(或返回)对返回的承诺的引用$q.all(...).then(...).由于获取数据所涉及的异步性,parsedResults的这种承诺将比原始外部变量更有用AllResults.
| 归档时间: |
|
| 查看次数: |
6874 次 |
| 最近记录: |