2013-03-26 18 views
8

OK, powiedzmy, że mam tablicę n wniosków XHR:Chaining nieznaną liczbę obietnic w 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(); 

Jak mogę być pewien zadzwonić ParseMyResultsArray() gdy wszystkie obietnice zostaną rozwiązane bez znajomości wielkość mojej tablicy requests?

Dzięki za pomoc!

Odpowiedz

17

Od kątowych docs do $http:

$ http API bazuje na odroczonych API/obietnica wystawionych przez $ q usług.

Stąd możliwe jest użycie $q.all() metodę, która pobiera tablicę obietnic oraz:

łączy wiele obietnic w jedną obietnicę, że zostanie rozwiązany po wszystkich obietnic wejściowych zostały rozwiązane

Kod realizacja jest:

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

Wiem, że to pytanie ma ponad rok, ale zasługuje na lepszą odpowiedź.

Kod może być znacznie bardziej zwięzły i można uniknąć brzydkich zewnętrznych znaków promises i AllResults oraz funkcji zewnętrznej ParseMyResultsArray().

Spróbuj ...

$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; 
}); 

Jeśli wymagana jest dodatkowo dostęp do parsedResults, to za wszelką cenę zachować (lub powrotu) odniesienie do obietnicy zwróconej przez $q.all(...).then(...). Ze względu na asynchroniczność związaną z uzyskiwaniem danych, ta obietnica przeanalizowanych rezultatów będzie znacznie bardziej użyteczna niż surowy zewnętrzny wariant AllResults.

Powiązane problemy