2016-05-31 15 views
1

Lass 'sagen, ich muss einen synchronen Upload von Dateien machen. Einer nach demanderen. Ich fand dieses Thema stackoverflow Thema. Und modifiziert, um den Code:jQuery zu simulieren synchrone Aufrufe der Funktion über Array

var arr = ["file1", "file2", "file3"]; 

var d = $.Deferred().resolve(); 
while (arr.length > 0) { 
    d = d.then(uploadFile(arr.shift())); 
} 

function uploadFile(file){ 
    var d = $.Deferred();  
    setTimeout(function(){ console.log("Uploading file:"+file); d.resolve(""); },1000); 
    return d.promise(); 
} 

aber ich bekomme sie noch alle asynchron aufgerufen, aber mit Timeout 1000

Hier Geige: fiddle

LÖSUNG: Big Dank an Felix. Hier funktioniert fiddle

+4

Sie müssen eine Funktion an '.then' übergeben, kein Versprechen. –

Antwort

1

Sie müssen eine Funktion an .then übergeben. Momentan rufen Sie uploadFile sofort innerhalb der Schleife an und übergeben ein Versprechen an .then anstelle einer Funktion.

Sie können folgendes tun, ohne eine Schleife zu verwenden:

d.then(function next() { 
    var promise = uploadFile(arr.shift()); 
    return arr.length === 0 ? promise : promise.then(next); 
}); 

Diese indirekte Rekursion statt einer Schleife verwendet.

+0

Ich habe nicht viel getan (wenn überhaupt) Verzögerung mit jQuery. Würde das Folgende auch funktionieren? 'd.then (function() {uploadFile (arr.shift())});' wenn der Upload durch Entfernen des Versprechens neu definiert wird ('function uploadFile (file) {console.log (" Datei hochladen: "+ Datei); } ')? – vol7ron

+0

Oder, ich nehme an, das Versprechen ist notwendig für die Synchronität – vol7ron

+0

* "Ich nehme an, das Versprechen ist notwendig für die Synchronität" * Ja. Ohne das würde es nicht auf die Auszeit warten. Wenn sich Ihr Code noch in der Schleife befand, würde die Schleife niemals enden, da die 'arr.shift()' innerhalb * des Callbacks stattfindet und somit 'arr.length' niemals kleiner werden würde. –