8

OK、 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

Angularドキュメントから$httpへ:

$ http APIは、$qサービスによって公開される遅延/プロミスAPIに基づいています。

したがって、 promiseの配列を受け取る$ q.all()メソッドを使用することが可能です。

複数のPromiseを1つのPromiseに結合し、すべての入力Promiseが解決されたときに解決されます

実装コードは次のとおりです。

$q.all(promises).then(function () { /* All promises are resolved */ });
于 2013-03-26T22:29:40.250 に答える
8

私はこの質問が1年以上前のものであることを知っていますが、それはより良い答えに値します。

コードははるかに簡潔になり、醜い外部変数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必要がある場合は、必ず、によって返されたpromiseへの参照を保持(または返す)してください$q.all(...).then(...)。データの取得には非同期性があるため、このparsedResultsの約束は、生の外部変数よりもはるかに便利ですAllResults

于 2014-07-16T20:28:02.737 に答える