我正在编写一个脚本,我需要循环一个AJAX请求数组:
$('#fetchPosts').click(function(){
for(var i=0; i < link_array.length; i++) {
settings = {
// some object not relevant
}
var status = main_ajaxCall(settings, i); // ajax call
}
});
function main_ajaxCall(settings, i) {
$.ajax({
type: "POST",
url: "../model/insert.php",
data:{obj_settings: settings},
dataType: "json",
cache: false,
success: function (data) {
// some handeling here
return 0;
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
return 1;
},
};
为什么AJAX请求会立即触发?它似乎没有等待来自model / insert.php的响应,有没有办法强制它在触发下一个AJAX请求之前等待响应?
编辑1:
似乎我不清楚,对不起,我不想让它等待,我想排队电话。
我无法在一个请求中拨打电话,这在我目前的情况下是不可能的。
答案 0 :(得分:4)
如果要等待响应,请将async设置为false(默认值:true)
$.ajax({
async: false,
...
http://api.jquery.com/jQuery.ajax/
如果您不想阻止,可以使用.ajaxComplete()
设置成功处理函数,如果要等待全部完成,则必须跟踪活动的AJAX连接 - How to know when all ajax calls are complete < / p>
最好的解决方案是将AJAX请求的数量减少到一个。如果你必须创建一个AJAX请求循环,那么逻辑可以在某处简化(或者把它放在服务器中?)
编辑1: (响应OP编辑)
如果你想对AJAX请求进行排队,这个问题在此之前已得到解答:
您也可以使用这些库(您需要做的就是Google):
答案 1 :(得分:1)
它立即触发并且不会等待,因为这是AJAX最擅长的(第一个A代表异步)。
对服务器的请求可能需要很长时间才能响应,并且在大多数情况下,不希望用户的浏览器冻结或阻止他们执行任何其他操作。如果你这样做,你可能只是使用正常的请求。
这就是为其提供成功错误功能的原因,因此它可以在服务器响应时调用它们。
如果您在调用insert.php时无法在浏览器中执行任何操作,则可以使用加载图像删除覆盖图(例如,深色div),并在成功时将其删除。
也许用“loading ...”文本替换$('#fetchPosts')元素,然后在完成后将其反转。隐藏fetchPosts元素的可见性并添加不同的“loading ..”元素是一种很好的方式。
答案 2 :(得分:0)
您的AJAX呼叫将等待服务器的响应,但是异步。也就是说,当服务器响应时,您的脚本将继续执行而不是阻止浏览器。当服务器响应时(或请求超时 - 通常是几秒钟),您的success:
或error:
函数将会执行。
此处代码的作用是根据link_array长度创建多个并发请求。
您可以在AJAX调用中指定async:false
,但这会在完成所有AJAX调用时冻结浏览器。
您应该重写代码以执行success:
函数中的所有处理。我建议你重写你的代码,将你的所有请求组合成一个,然后进行一次AJAX调用而不是几次,并让服务器将所有响应作为一个块返回。我不能确切地建议你如何做到这一点 - 它依赖于实现。
编辑: 在回答您的澄清时,如果您希望按顺序调用它们,则需要使用成功函数来调用下一个。然后,您将成功调用下一个成功链,其成功调用下一个,其成功调用下一个..等到最后一个进行最终处理。一种方法是将呼叫号码传递给成功功能。