所有AJAX请求完成后,JQuery调用函数

时间:2011-07-22 20:21:06

标签: jquery ajax callback

我的问题是问题here

的变体

然而,有两点不同:

  1. 我不知道有多少AJAX请求。当然,它们至少有10个。它们同时或几乎同时运行,并且请求的数量每次都在变化。

  2. 我想调用的函数也会产生AJAX请求。我不希望AJAX请求永远继续下去(这是我第一次尝试时发生的事情)。我只想一次这个功能。

  3. 这是我的代码:

    $("#calculateButton").ajaxComplete(function() {
        $(this).unbind();
        $(this).click();
    });
    

    所以我尝试做的是将ajaxComplete回调附加到calculate按钮。问题是每次ajax请求完成时都会执行此操作。而我想要的是在所有 AJAX请求完成时执行该函数。

    有没有办法做到这一点。当我把它写出来时,听起来很复杂。我应该放弃并创建一个hacky work-around?

3 个答案:

答案 0 :(得分:8)

使用.ajaxStop()代替您当前的方法。

$("#calculateButton").ajaxStop(function() {
    $(this).unbind(); // $(this).unbind("ajaxStop") -> this is not needed as unbind will remove everything, but leaving it here as an FYI
    $(this).click();
});

http://api.jquery.com/ajaxStop/

注意:更新了上面的代码以停止无限循环。

答案 1 :(得分:0)

您可以使用jQuery 1.5中引入的deferred objects [docs]

如何设置它取决于你如何进行Ajax调用,但通常它是这样的:

$.when(callAjaxA(), callAjaxB(), callAjaxC(), ...).then(callAjaxFinal);

callAjaxX函数将返回$.ajax返回的promise对象。您还可以通过pipe [docs]轻松添加新来电。

一旦callAjaxFinal中发出的所有请求都完成,这将执行callAjaxX

答案 2 :(得分:0)

你应该创建一些局部变量,每个请求都可以访问。让我们称之为ajaxCount并在开头为它分配0(零)。

对于您想要计算阻止功能的每个请求,ajaxCount增加一个。在此特定请求完成时执行的回调中(错误或成功), ajaxCount减少1(一)

此外,在上面提到的每个回调中,只有减少ajaxCount后,调用另一个函数检查ajaxCount是否等于{{1} }(零)。如果测试结果是肯定的(意味着此时没有发生AJAX请求),请执行您想要执行的操作。

这是基本思路,实施相当简单。如果您对此有任何问题,请与我们联系。

相关问题