Jquery each()循环内的Ajax调用不是异步的
我要做的是通过一系列的复选框 对于检查的每一个,我都必须使用ajax调用执行一些计算。如果出现错误,我必须中断循环并返回消息 每个ajax调用大约需要0,4秒来执行,但这绝不会是一个问题,因为在任何给定时间,我最多只能检查其中的4个 但我面临的问题是,最后一个警报框会在错误函数中的警报框之前弹出。error函数确实起作用,但它总是出现在最后一个函数之后 我的印象是,通过将调用定义为asynchronous=false,代码执行将等待调用返回响应。这是一个错误的假设吗 有没有办法做到这一点 提前谢谢Jquery each()循环内的Ajax调用不是异步的,jquery,ajax,asynchronous,each,Jquery,Ajax,Asynchronous,Each,我要做的是通过一系列的复选框 对于检查的每一个,我都必须使用ajax调用执行一些计算。如果出现错误,我必须中断循环并返回消息 每个ajax调用大约需要0,4秒来执行,但这绝不会是一个问题,因为在任何给定时间,我最多只能检查其中的4个 但我面临的问题是,最后一个警报框会在错误函数中的警报框之前弹出。error函数确实起作用,但它总是出现在最后一个函数之后 我的印象是,通过将调用定义为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);
我不熟悉ajax调用中的异步选项。我已经成功地将jQuery Ajax管理器用于需要同步Ajax调用的情况:我不熟悉Ajax调用中的异步选项。我已经成功地将jQuery Ajax管理器用于需要同步Ajax调用的情况:如中所述,错误函数是 请求失败时要调用的函数 也就是说,如果客户端和服务器之间存在通信问题,例如:超时、无授权等。当服务器端脚本返回一个在应用程序中被视为错误的值时,不会调用它。将该代码移到success中,并检查响应数据以查看脚本如何处理每个请求 另外,我应该提到,使用同步调用需要有很好的理由。是的,在您的测试中只需要1.5秒,但是当有人连接速度慢,或者您的服务器负载重或不可用时会发生什么情况?同步请求会冻结客户端的浏览器,也就是说,即使是更改选项卡或滚动之类的操作也不会产生非常糟糕的用户体验。如果您确实想阻止页面上的UI,有很多更友好的方法。例如,退房 使用回调并开始异步思考比按程序思考要好得多。第一次开始时会有点困难,因为代码不一定是按逐行顺序运行的,但一旦掌握了窍门,它就会非常强大和灵活。如中所述,错误函数是 请求失败时要调用的函数 也就是说,如果客户端和服务器之间存在通信问题,例如:超时、无授权等。当服务器端脚本返回一个在应用程序中被视为错误的值时,不会调用它。将该代码移到success中,并检查响应数据以查看脚本如何处理每个请求 另外,我应该提到,使用同步调用需要有很好的理由。是的,在您的测试中只需要1.5秒,但是当有人连接速度慢,或者您的服务器负载重或不可用时会发生什么情况?同步请求会冻结客户端的浏览器,也就是说,即使是更改选项卡或滚动之类的操作也不会产生非常糟糕的用户体验。如果您确实想阻止页面上的UI,有很多更友好的方法。例如,退房
使用回调并开始异步思考比按程序思考要好得多。刚开始的时候有点困难,因为代码不一定是按逐行顺序运行的,但一旦掌握了窍门,它就非常强大和灵活。我认为您需要使用
,async: false
这样就可以传递布尔值false,而不是字符串false。这将使AJAX调用同步
有关类似情况和更多详细信息,请参阅。特别是,您可能会发现,对于同步AJAX调用,您不能使用成功处理程序,必须在调用完成后返回结果,这超出了AJAX调用本身的范围
如果可能的话,您应该尝试重新构造代码,使其能够异步工作。同步执行不能很好地转换到浏览器
在您的情况下,如果您使用每个Ajax调用来累积检查的每个复选框的结果,请考虑将工作值存储在窗口变量中,并跟踪哪些请求已经返回。当您确定您已收到针对您发起的每个AJAX调用的成功响应时,您可以启动警报框或对结果执行任何其他操作。这只是你如何开始异步思考的一个例子。
我认为你需要使用,async: false
这样就可以传递布尔值false,而不是字符串false。这将使AJAX调用同步
有关类似情况和更多详细信息,请参阅。特别是,对于synchro,您可能会发现
在AJAX调用中,您不能使用成功处理程序,必须在调用完成后返回结果,因为您不在AJAX调用本身的范围内
如果可能的话,您应该尝试重新构造代码,使其能够异步工作。同步执行不能很好地转换到浏览器
在您的情况下,如果您使用每个Ajax调用来累积检查的每个复选框的结果,请考虑将工作值存储在窗口变量中,并跟踪哪些请求已经返回。当您确定您已收到针对您发起的每个AJAX调用的成功响应时,您可以启动警报框或对结果执行任何其他操作。这只是开始异步思考的一个示例。
使用async:false而不是async:false并享受。使用async:false而不是async:false并享受。我将尝试按照您描述的方式使用async参数。对于这种情况,我确实有一个替换代码没有使用async:false,但我很好奇为什么它不能按预期的方式工作。已经尝试使用布尔值,但没有效果。仍然是相同的结果。将您的建议应用到缓存参数,所有操作都按预期进行。感谢您花时间回答这个问题。我将尝试按照您描述的方式使用async参数。对于这种情况,我确实有一个替换代码没有使用async:false,但我很好奇为什么它不能按预期的方式工作。已经尝试使用布尔值,但没有效果。仍然是相同的结果。将您的建议应用到缓存参数,所有操作都按预期进行。感谢您花时间回答这个问题。我知道在这种情况下不应该调用error函数。为了澄清代码,我在错误的地方粘贴了一些。现在编辑,谢谢你的提醒。投票支持你的评论。我知道在那种情况下不应该调用error函数。为了澄清代码,我在错误的地方粘贴了一些。现在编辑,谢谢你的提醒。投票支持你的评论。谢谢你的提示。似乎值得深入研究。谢谢你的提示。似乎值得深入研究。