2013-10-27 12 views
22

Mit dem Deferred-Muster von jQuery http://api.jquery.com/jQuery.when/, versuche ich mehrere Jsonp Ajax-Aufrufe und warten auf die Ergebnisse vor dem nächsten Schritt. Ich kann dies mit einer festgelegten Anzahl von Aufrufen erreichen, weil ich die Anzahl der aufgelösten Argumentparameter im verzögerten Objekt ".done()" festlegen kann. Aber in meiner Anwendung funktioniert es nicht, weil die Anzahl der Anrufe dynamisch und immer unbekannt ist.Dynamische mehrere verzögerte jQuery Ajax Anrufe

Dieses erste vereinfachte Beispiel funktioniert, weil ich die Anzahl der Argumente in der .done() aufgelöste Funktion festlegen kann. Ich weiß, dass ich zwei brauchen, weil es zwei Anrufe in der .when ist():

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

Das ist, was ich brauche, aber es kann nicht zur Arbeit kommen: auf

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

Vielen Dank für jede Hilfe Dies!

Antwort

30

Sie arguments verwenden können, die zu einer Funktion ein besonderes König von Objekt übergeben

$.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

Dank alle Argumente hält, das funktioniert! –

+0

Das funktioniert gut, wenn Sie mindestens zwei Anforderungen senden müssen. Andernfalls erhalten Sie ein inkonsistentes Verhalten, wenn es eine oder mehrere Abfragen gibt :( – Happynoff

+0

Die Verknüpfung zu Argumenten ist veraltet und verweist auf eine veraltete Funktion. Der [aktualisierte Link ist dies] (https://developer.mozilla.org/en- US/docs/Web/JavaScript/Referenz/Funktionen/Argumente) – Liam