2016-05-31 53 views
1

假設我需要對文件進行同步上傳。相繼。 我發現這個stackoverflow的話題。而且修改了代碼:jQuery承諾模擬數組上的函數同步調用

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

但我還是讓他們所有異步調用,但超時1000

這裏是提琴:fiddle

SOLUTION: 大感謝名單菲利克斯。這裏是工作fiddle

+4

您必須將函數傳遞給'.then',而不是承諾。 –

回答

1

你必須通過一個函數.then。目前您正在呼叫uploadFile立即在循環內並將承諾傳遞給.then而不是函數。

您可以執行以下操作,而無需使用一個循環:

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

這將使用間接遞歸代替循環。

+0

我沒有做很多(如果有的話)推遲使用jQuery。下面的工作也會起作用嗎? ''d.then(function(){uploadFile(arr.shift())});'如果通過移除promise來重新定義上傳('function uploadFile(file){console.log(「Uploading file:」+ file); }')? – vol7ron

+0

或者,我想承諾是必要的同步 – vol7ron

+0

*「我認爲承諾是必要的同步性」*是的。沒有它,它不會等待超時。另外,如果你的代碼仍然在循環中,循環將永遠不會終止,因爲'arr.shift()'發生在回調中,因此'arr.length'永遠不會變小。 –