Ajax在每个()循环内部调用不是异步的

时间:2009-11-10 14:31:54

标签: 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);

4 个答案:

答案 0 :(得分:7)

我认为你需要使用

,async: false

因此您传递布尔 false ,而不是字符串“false”。这应该使你的AJAX调用同步。

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

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

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

答案 1 :(得分:6)

正如manual中所述,error功能是......

  

请求失败时要调用的函数。

即,如果客户端和服务器之间存在通信问题(例如:超时,无授权等)。当您的服务器端脚本返回一个在您的应用程序中被视为错误的值时,不会调用它。将该代码移至success,并检查响应数据以查看脚本如何处理每个请求。

另外,我应该提一下,你需要非常好的理由来使用同步调用。是的,在您的测试中它只需要1.5秒,但是当某人连接速度慢或您的服务器负载不重或不可用时会发生什么?同步请求会冻结客户端的浏览器(即,甚至不会更改标签或滚动工作),并导致非常糟糕的用户体验。如果您确实要阻止页面上的UI,那么有很多更友好的方法可以做到这一点。例如,请查看BlockUI

使用回调并开始异步思考,而不是在程序上进行思考要好得多。当你第一次启动时(因为你的代码不一定按行顺序运行),这有点困难,但是一旦你掌握了它,它就非常强大和灵活。

答案 2 :(得分:4)

使用async:false代替async:"false"并享受。

答案 3 :(得分:0)

我不熟悉ajax调用中的async选项。在我需要同步ajax调用的情况下,我一直在使用jQuery Ajax Manager成功:http://plugins.jquery.com/project/AjaxManager