2014-01-27 80 views
2

我正在使用AJAX调用一些Web服务。 在我的网页上,用户必须选择一个或多个人加入一个组。这个“组列表”被发送到一个PHP页面(使用POST方法),该页面将执行关联的WebServices。AJAX:同步或队列?

我的问题是关于同步/异步AJAX调用。 我的目标是在过程中显示一个动画(例如gif),它阻止用户界面,最后显示消息“完成”。我使用了两个Jquery插件:Apprise的消息和动画的jquery msg。

同步模式:不显示动画,但当AJAX调用完成时,将显示消息“完成”。 在异步模式下:显示动画,但在AJAX调用结束之前显示消息“complete”。

所以我的问题是,我必须排队多个异步AJAX调用?还是其他什么?

+1

您正在提前完成,因为您并未等待请求完整显示完成。 ***使用回调!*** –

+0

@ThmMrn我的回答对你有帮助吗?如果不是,请告诉我们什么是不工作。 – RononDex

回答

1

是的,这可能是因为您有多个同时运行的异步调用。
我用下面的小脚本来控制Ajax调用多少正在运行:

$.xhrPool = { calls: [] }; 
$.xhrPool.abortAll = function() { 
    $(this.calls).each(function (idx, jqXHR) { 
     jqXHR.abort(); 
    }); 
    $.xhrPool.calls = []; 
}; 


// Setup ajax requests 
$.ajaxSetup({ 
    beforeSend: function (jqXHR) { 
     $.xhrPool.calls.push(jqXHR); 
    }, 
    complete: function (jqXHR) { 
     var isInArray = $.inArray(jqXHR, $.xhrPool.calls); 

     if (isInArray > -1) { 
      $.xhrPool.calls.splice(isInArray, 1); 
     } 
    } 
}); 

这种方式,您将有数组$.xhrPool.calls在所有当前活动的Ajax请求。然后你可以检查if ($.xhrPool.calls.length == 0),如果是删除你的加载动画。

此外,您可以拨打$.xhrPool.abortAll(),这将停止所有活动的ajax请求。

+0

我相信这足以跟踪未决的AJAX调用的_count_。你有没有理由将它们全部存储在列表中? –