【问题标题】:Calling code after .each in jquery [duplicate]在jQuery中的.each之后调用代码[重复]
【发布时间】:2018-11-10 16:51:37
【问题描述】:

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

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

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

当前的基本代码 - 不工作

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

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

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

【问题讨论】:

  • @Liam 他没有尝试返回任何东西,只是等待它们全部完成。

标签: jquery


【解决方案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");
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多