在AngularJS中链接未知数量的承诺

时间:2013-03-26 22:14:53

标签: angularjs promise

好的,假设我有一系列 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

感谢您的帮助!

2 个答案:

答案 0 :(得分:17)

从有角度的文档到$http

  

$ http API基于$ q公开的延迟/承诺API   服务。

因此可以使用$q.all()方法来获取一系列承诺,并且:

  

将多个承诺组合到一个单独的承诺中,该承诺在何时解决   所有输入承诺都已解决

实施代码是:

$q.all(promises).then(function () { /* All promises are resolved */ });

答案 1 :(得分:8)

我知道这个问题已经过了一年多了,但值得更好的答案。

代码可以更加简洁,可以避免丑陋的外部变量promisesAllResults以及外部函数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更有用。