jquery - each() 循环内的 Ajax 调用不是异步的

标签 jquery ajax asynchronous each

我想要做的涉及通过一系列复选框。

对于每一个被检查的,我都必须执行一些计算(使用 ajax 调用)。如果出现错误,我必须中断循环并返回一条消息。

每个 ajax 调用大约需要 0.4 秒来执行,但这永远不会成为问题,因为在任何给定时间我最多只能检查其中 4 个。

但我面临的问题是,最后一个警告框在错误函数()内的警告框之前弹出。错误函数确实有效,但它总是出现在最后一个函数之后。

我的印象是,通过将调用定义为 asynchronous=false,代码执行将等待调用返回响应。这是一个错误的假设吗?

有办法实现这一点吗?

提前致谢

$("input[id*='chk_aut']").each(function() {
  if(this.value=="on") {
    $.ajax({
      type: "GET",
      url: "testpage.asp",
      cache:"false",
      async:"false",
      data: "which=checkvalues&value="
          + i_value
          + "&ref="+$("#cb_ref").val()
          + "&nif="+$("#txt_nif").val()
          + "&day="+i_day
          + "&month="+i_month
          + "&hours="+i_hours
          + "&year="+i_year + "&ms="
          + new Date().getTime(),
      success: function(msg) {
        //do something but continue the loop
      },
      error: function() {
        i_result =false;
        alert("An error has occurred");
        return false;//break the  loop
      }
    });
  }
});
alert(i_result);

最佳答案

我认为你需要使用

,async: false

这样您就可以传递 bool 值false,而不是字符串“false”。这应该使您的 AJAX 调用同步。

参见this question对于类似的情况和更多细节。特别是,您可能会发现,对于同步 AJAX 调用,您无法使用成功处理程序,并且必须在调用完成后返回结果(您超出了 AJAX 调用本身的范围)。

如果可能的话,您应该尝试重构您的代码,以便它可以异步工作。同步执行不能很好地转换为浏览器。

在您的情况下,如果您使用每个 AJAX 调用来累积选中的每个复选框的结果,请考虑将工作值存储在窗口变量中并跟踪已返回的请求。当您确定已收到发起的每个 AJAX 调用的成功响应时,您可以启动警报框或对结果执行任何其他操作。这只是如何开始异步思考的一个示例。

关于jquery - each() 循环内的 Ajax 调用不是异步的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1708389/

相关文章:

iOS - 串联基于 block 的异步操作

javascript - 在循环中链接 JavaScript Promise - bluebird

javascript - 如何从 url 获取参数并在 HTML 中使用它?

javascript - 单击以使用 jquery 获取数组元素的索引

javascript - 跨域 AJAX 请求返回字符串

java - 使用Nutch如何抓取使用ajax的网页的动态内容?

java - 在 Spring Boot 中正确使用 @Async、@Scheduled 和线程池

javascript - 将日期时间转换为日期对象

javascript - 如何调用具有动态数据的onclick jquery函数,Asp.net Mvc5

asynchronous - 如何同步等待 Dart Future 完成