AJAX:同步还是队列?

时间:2014-01-27 15:43:04

标签: jquery ajax asynchronous

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

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

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

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

1 个答案:

答案 0 :(得分: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请求。