1

我正在尝试做的是通过一系列复选框。

对于检查的每一个,我都必须执行一些计算(使用 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

4 回答 4

6

手册中所述,该error功能是...

请求失败时调用的函数。

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

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

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

于 2009-11-10T14:43:57.327 回答
6

我认为你需要使用

,async: false

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

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

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

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

于 2009-11-10T14:50:39.667 回答
4

使用async:false而不是async:"false"享受。

于 2010-09-21T12:08:26.990 回答
0

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

于 2009-11-10T14:43:03.123 回答