AJAX调用每一个()循环不是异步的,里面
-
19-09-2019 - |
题
我试图做涉及通过一系列的复选框会。
有关它们中的每一个,它被选中,我不得不执行一些计算(使用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