2016-04-18 6 views
4

Ich habe eine Liste der Sprache, ['en', 'de'] und so weiter, und ich möchte komplexe AJAX-Anfrage für jede Sprache zu nehmen. Bei der ersten Ajax-Anfrage bekomme ich eine Intents-Menge für jede Sprache. Ich muss Phrasen Menge für jede Absicht aus früheren Aufruf zählenOrder of Deferred Jquery Ajax Anfragen

var languages = ['en', 'de', 'es', 'fr', 'it', 'cn']; 
intents_dic = []; 
chart_quantity = ['quantity']; 
for (var x = 0; x < languages.length; x++){ 
    $.ajax({ 
    url: 'url', 
    type: 'GET', 
    async: false, 
    success: function(data){ 
     for (i in data){ 
      intents_dic.push(data[i]['id']) 
     } 
     var intents_count = 0; 
     var deferreds = []; 

Und auf der zweiten Stufe. Ich verwende die Deferred List für diese Aufgabe.

for (var id = 0; id < intents_dic.length; id++){ 
    deferreds.push($.ajax({ 
    url: 'url', 
    type: 'GET', 
    success: function(data){ 
     intents_count += data['templates'].length; 
     } 
    })) 
} 
$.when.apply(null, deferreds).done(function() { 
    chart_quantity.push(intents_count); 
}) 

Aber als latente AJAX-Anfragen abgeschlossen sind, unterscheidet sich die Reihenfolge der Fertigstellung mit Sprachliste um (es ist Hauptplan für den Aufbau). Kann dieses Problem behoben werden, oder ist es eine Funktion von Ajax-Anrufen? Vielen Dank.

+0

Ja, es ist ein Merkmal. – Bergi

+0

Verwenden Sie nicht 'async: false'! – Bergi

+0

@Bergi ist es besser, Schließen anstelle von Synchronisierungsanfragen zu verwenden? –

Antwort

0

Hier ist Ihre gegabelte und damit funktionierende jsfiddle (asynchrone Aufrufe mit geordneten Ergebnissen).

for(var i = 0; i < 5; i++){ 
    setTimeout(function(x){ 
     done(x,results); 
    }(i),1000); 
} 

http://jsfiddle.net/htuz3t3m/2/

+0

Danke, funktioniert für mich. –

+0

Rückrufe sind in jQuery wichtig. – Mantisse