在jquery

时间:2018-05-31 15:53:02

标签: jquery

我正在将文件上传到服务器,并希望在完成所有文件上传后切换一些按钮。文件以.each上传,因此代码应在此之后运行。我一直在研究这个并看到.each是同步的,所以如果我把代码放在.each之外但是它不起作用它应该可以工作。

我想知道这是否是因为.each内有一个ajax调用。

我还看到了在您进行循环并在最后一次迭代时调用代码时计数的示例,但我想知道是否有更清晰的方法来执行此操作。

当前基本代码 - 无效

$.each( function () {
  ...
});
$("#btnNext").removeAttr("hidden") //want this to run after

我还尝试了在控制台中出错的承诺

$.each( function () {
  ...
}).promise().done(function() {
    $("#btnNext").removeAttr("hidden")
});

1 个答案:

答案 0 :(得分:1)

  

我想知道这是否是因为在.each中有一个ajax电话。

这就是原因。 AJAX调用是异步的,因此removeAttr()调用将在这些请求完成之前发生。

要解决此存储,从数组中的AJAX调用返回延迟对象,然后将它们应用于$.when()。在回调中,您可以执行所有请求完成后运行的任何逻辑。

var requests = [];
$.each( function () {
  requests.push($.ajax({
    // your ajax options here...
  }));
});

$.when.apply($, requests).done(function() {
  $("#btnNext").removeAttr("hidden");
});