8

好的,假设我有一个包含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数组大小的情况下,如何确保在所有承诺都解决时调用?

谢谢你的帮助!

4

2 回答 2

17

从角度文档到$http

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

因此,可以使用$q.all()方法,该方法采用一组承诺,并且:

将多个 Promise 组合成一个 Promise,当所有输入 Promise 都已解决时,该 Promise 将被解决

实现代码为:

$q.all(promises).then(function () { /* All promises are resolved */ });
于 2013-03-26T22:29:40.250 回答
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 的这个承诺将比原始的外部 var 有用得多AllResults

于 2014-07-16T20:28:02.737 回答