2017-02-09 2 views
-1

Ich habe eine dynamisch bestimmte Liste von Ajax-Anrufe, die nacheinander vorgenommen werden müssen. Da Versprechen nicht in allen Browsern gleichermaßen umgesetzt werden, gibt es eine Möglichkeit, jeden Ajax-Aufruf nach dem Abschluss des vorherigen zu machen?Führen Sie Ajax Anrufe in Reihenfolge

Ich habe versucht:

var favoritesArray = [1,2,3] //dynamically created by user 
var arrayOfCalls = $.each(favoritesArray, function each(idx) { 
    var favId = favoritesArray[idx]; 
    return $.ajax({ url: '/favorites/' + favId, type: 'DELETE' }); 
}); 
$.when(arrayOfCalls) 
.then(function success() { 
    doStuff(); 
}); 

Alle Anrufe laufen, aber warten nicht auf die vorherige zu beenden. Gibt es einen Weg, das zu erreichen?

+0

Nicht sicher, warum Sie sich Sorgen machen. Keine davon scheint von den vorherigen abhängig zu sein. '$ .when' wird konsistent über den Browser sein, aber beachten Sie, dass nichts von '$ .each' zurückgegeben wird.' arrayOfCalls 'ist also undefiniert. – charlietfl

+0

Jeder Aufruf aktualisiert dieselbe Liste und wenn die Aufrufe gleichzeitig abgefeuert werden, bleiben die in der Liste wird falsch und unterschiedlich sein, je nachdem, welches zuerst abgeschlossen wurde. – ebbishop

+0

Danke für den Hinweis über $ .Each obwohl. – ebbishop

Antwort

0

Sie können die Rekursion verwenden. (I verwendet SetTimeout anstelle von AJAX-Request)

function syncExecute(index,length){ 
var favId = favoritesArray[index]; 
setTimeout(function(){ 
if(index<length){ 
     syncExecute(index+1,length); 
      console.log(index); 
     }else{ 
     console.log("All Call Executed"); 
     } 
},5000); 

} 

syncExecute(0,favoritesArray.length); 

Demo: https://jsfiddle.net/b18vo9ds/

Sie setTimeout mit AJAX-Request ersetzen kann, und resursive die Funktion auf Erfolg von AJAX-Request aufrufen.