排队多个AJAX请求,等待响应而不冻结浏览器?

时间:2013-07-08 02:36:29

标签: javascript jquery ajax queue

我正在编写一个脚本,我需要循环一个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:

似乎我不清楚,对不起,我不想让它等待,我想排队电话。

我无法在一个请求中拨打电话,这在我目前的情况下是不可能的。

3 个答案:

答案 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调用而不是几次,并让服务器将所有响应作为一个块返回。我不能确切地建议你如何做到这一点 - 它依赖于实现。

编辑: 在回答您的澄清时,如果您希望按顺序调用它们,则需要使用成功函数来调用下一个。然后,您将成功调用下一个成功链,其成功调用下一个,其成功调用下一个..等到最后一个进行最终处理。一种方法是将呼叫号码传递给成功功能。