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

Fra*_*uis 8 promise angularjs

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


Roa*_*888 8

我知道这个问题已经有一年多了,但值得更好的回答.

该代码可以是远更简洁和丑陋外VARS 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;
});
Run Code Online (Sandbox Code Playgroud)

如果需要进一步访问parsedResults,则通过一切手段保留(或返回)对返回的承诺的引用$q.all(...).then(...).由于获取数据所涉及的异步性,parsedResults的这种承诺将比原始外部变量更有用AllResults.