2016-05-31 55 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'永远不会变小。 –