我试图做涉及通过一系列的复选框会。

有关它们中的每一个,它被选中,我不得不执行一些计算(使用AJAX调用)。如果有错误,我必须打破循环并返回一个消息。

每一个Ajax调用需要大约0,4秒钟,进行了但永远不会成为一个问题,因为我只能有一个最大的其中4个在任何给定的时间进行检查。

但我现在面临的问题是,误差函数里面的一个前的最后警告框弹出,()。误差函数的工作,但它最终一个后总是出现。

我的印象是,通过定义呼叫作为异步=假,代码执行将等待,直到呼叫返回的响应。那是一个错误的假设?

有没有办法做到这一点?

在预先感谢

$("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

让你通过布尔的错误,不是字符串的 “假”。这应该让你的AJAX调用是同步的。

请参阅用于类似的情况这一问题和一些更多的细节。特别是,你可能会发现同步AJAX调用您不能使用成功处理程序,并且必须返回结果,一旦您的通话已完成(你出了AJAX的范围调用本身)。

如果可能的话,你应该尝试调整你的代码,以便它可以异步工作。同步执行翻译不好到浏览器。

在您的情况,如果您使用的每个AJAX调用来积累的被检查每个复选框的结果,考虑在一个窗口变量存储的工作值和跟踪哪些请求已经返回。当你确定你已经收到成功回每个AJAX的呼叫您发起的,你可以脱掉你的警告框或者其他任何你想要的结果做。这是如何开始思考异步只是一个例子。

其他提示

如在手册时,所述error功能是...

  

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

即,如果有在客户端和服务器之间的通信问题(例如:超时,无授权等)。当你的服务器端脚本返回它在你的应用被认为是一个错误的值,它不叫。动议代码到success,并且检查响应数据以了解你的脚本处理的每个请求。

另外,我要指出,你需要有真正很好的理由使用同步调用。是的,在您的测试只需要1.5秒,但是当一个人有一个连接速度慢,或者你的服务器负载过大或不可用下会发生什么?同步请求冻结客户端的浏览器(即,甚至没有之类的变化选项卡或滚动的作品),并为一个的非常的不好的用户体验。如果你想阻止你的页面上的用户界面,有很多友好的方式来做到这一点。例如,检查出 BlockUI

有更好的使用回调和异步开始思考,而不是程序上。这是一个有点当你第一次启动(因为你的代码是不一定行由行的顺序运行)斗争,但一旦你得到了它的窍门是非常强大和灵活。

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

我不熟悉Ajax调用async选项。我一直在使用jQuery阿贾克斯经理成功,我需要同步的Ajax调用情况:的http:// plugins.jquery.com/project/AjaxManager

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top