【问题标题】:jQuery promise to simulate synchronous calls of function over arrayjQuery 承诺在数组上模拟函数的同步调用
【发布时间】:2016-05-31 14:01:13
【问题描述】:

假设我需要同步上传文件。相继。 我发现了这个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

【问题讨论】:

  • 你必须将一个函数传递给.then,而不是一个promise。

标签: javascript jquery promise jquery-deferred


【解决方案1】:

你必须将一个函数传递给.then。目前,您正在循环内立即调用uploadFile,并将promise 传递给.then 而不是函数。

您可以在不使用循环的情况下执行以下操作:

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

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

【讨论】:

  • 我没有做太多(如果有的话)延迟 jQuery。以下也可以吗? d.then(function() { uploadFile(arr.shift()) }); 如果通过删除承诺重新定义上传 (function uploadFile(file) { console.log("Uploading file:" + file); })?
  • 或者,我认为承诺对于同步性是必要的
  • “我想承诺是同步性所必需的” 是的。没有它,它不会等待超时。此外,如果您的代码仍在循环内,则循环将永远不会终止,因为arr.shift() 发生在回调内部,因此arr.length 永远不会变小。
  • 阅读:abdulapopoola.com/2014/12/12/…——很酷的东西。我认为我对生活的新兴趣是从一门语言中休息一下,然后重新审视它们,看看我忘记或从未学过的东西 :) tbh,我最近一直在做更少的 jQuery 和更多的 React/ES6 跨度>
猜你喜欢
  • 2023-03-17
  • 2019-01-15
  • 2016-06-22
  • 2016-02-05
  • 2017-08-12
  • 1970-01-01
  • 2023-03-28
  • 2020-10-07
  • 2015-09-04
相关资源
最近更新 更多