jQuery承诺模拟函数对数组的同步调用

时间:2016-05-31 14:01:13

标签: javascript jquery promise jquery-deferred

让我们说我需要同步上传文件。相继。 我发现了这个stackoverflow主题。并修改了代码:

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

解: 菲利克斯的大笨蛋。这是工作fiddle

1 个答案:

答案 0 :(得分:1)

您必须将功能传递给.then。目前,您正在循环内部立即调用uploadFile并将承诺传递给.then而不是函数。

您无需使用循环即可执行以下操作:

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

这使用间接递归而不是循环。