2009-11-10 42 views
1

我想要做的事情涉及通过一系列复选框。每个()循环内的Ajax调用不是异步的

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

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

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

我的印象是,通过将调用定义为异步= 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); 

回答

7

我认为你需要使用

,async: false 

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

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

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

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

+0

我将尝试按照您描述的方式使用async参数。我有这种情况的替代代码(不使用async:false),但我很好奇它为什么不按预期的方式工作。 – 2009-11-10 15:09:01

+0

已经尝试使用布尔值但无济于事。 仍然有相同的结果。 – 2009-11-11 10:34:28

+0

将您的建议应用于缓存参数,并且所有内容均按预期工作。感谢您花时间回答这个问题。 – 2009-11-11 14:25:34

0

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

+0

感谢您的提示。似乎值得深入研究。 – 2009-11-10 15:26:39

6

正如manual提到的,error功...

的函数被调用,如果请求失败。

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

另外,我要指出,你需要有真的很好的理由使用同步调用。是的,在您的测试中,只需要1.5秒,但是当某人连接速度缓慢,或者您的服务器负载过重或无法使用时会发生什么?同步请求会冻结客户端的浏览器(即,甚至不会更改标签页或滚动工具等),并导致用户体验不佳。如果你想阻止你的页面上的用户界面,有很多友好的方式来做到这一点。例如,检查出BlockUI

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

+0

我知道在这种情况下不应该调用错误函数。为了澄清我在一些错误的地方粘贴了一些代码。现在编辑并感谢您的支持。注释掉你的评论。 – 2009-11-10 15:11:49

4

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