2013-10-27 31 views
22

Używanie odroczonego wzorca z jQuery http://api.jquery.com/jQuery.when/, Próbuję wykonać wiele wywołań jsonp ajax i czekać na wyniki przed przejściem do następnego kroku. Mogę to zrobić za pomocą ustalonej ilości wywołań, ponieważ mogę ustawić liczbę parametrów argumentów rozstrzygniętych w obiekcie odroczonym ".done()". Ale w mojej aplikacji to nie działa, ponieważ liczba połączeń jest dynamiczna i zawsze nieznana.Dynamiczne wielokrotne Odroczone wywołania jQuery Ajax

Ten pierwszy uproszczony przykład działa, ponieważ mogę ustawić liczbę argumentów w funkcji rozwiązanej .done(). Wiem, że muszę dwa ponieważ istnieją dwa połączenia w .Przy():

$.when($.ajax(url1), $.ajax(url2)).done(function(a1, a2) { 
    var data = a1[ 0 ] + a2[ 0 ]; 
}); 

To jest to, czego potrzebuję, ale nie może zmusić go do pracy:

var urls = GetUrlList(); // returns array of urls to json service 
var requests = []; // hold ajax request 
for (i = 0; i < urls.length; i++) { 
    requests.push($.ajax(url[i])); 
} 

$.when.apply($, requests).done(function ("what goes here?") { 
    // Need to get the data returned from all ajax calls here 
}); 

Dzięki za wszelką pomoc na to!

Odpowiedz

30

Można użyć arguments, który jest specjalnym król obiekt posiadający wszystkie argumenty przekazywane do funkcji

$.when.apply($, requests).done(function() { 
    console.log(arguments); //it is an array like object which can be looped 
    var total = 0; 
    $.each(arguments, function (i, data) { 
     console.log(data); //data is the value returned by each of the ajax requests 

     total += data[0]; //if the result of the ajax request is a int value then 
    }); 

    console.log(total) 
}); 
+0

Dzięki, że działa! –

+0

Działa to dobrze, gdy masz co najmniej dwie prośby do wysłania. W przeciwnym razie otrzymasz niespójne zachowanie, gdy jest to jedno zapytanie lub kilka :( – Happynoff

+0

link do argumentów jest nieaktualny i wskazuje na nieaktualną funkcję. [Zaktualizowany link jest to] (https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Functions/arguments) – Liam