2013-03-26 3 views
8

OKにおける約束の数が不明なチェーン:のは、私が<strong>n個</strong> XHRリクエストの配列を持っているとしましょう、AngularJS

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アレイのサイズ?

ありがとうございました! $httpに角度のドキュメントから

答えて

17

$のHTTP APIは、$ qを サービスによって公開延期/約束のAPIに基づいています。

従って約束の配列及び取り$q.all()方法を使用することが可能である:

が 入力約束のすべてが解決されたときに解決され、単一の約束に複数の約束を組み合わせを

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

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

私はこの質問が1歳以上であることを知っていますが、より良い答えが必要です。

コードははるかに簡潔になり、醜い外側のバールpromisesAllResultsと外側の機能ParseMyResultsArray()は避けることができます。

$q.all(...).then(...)によって返された約束に基づいparsedResultsへのさらなるアクセスが必要な場合は、すべての手段によって維持(またはリターン)

$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は、生の外側の文字列AllResultsよりはるかに役立ちます。

関連する問題