我的问题是问题here
的变体然而,有两点不同:
我不知道有多少AJAX请求。当然,它们至少有10个。它们同时或几乎同时运行,并且请求的数量每次都在变化。
我想调用的函数也会产生AJAX请求。我不希望AJAX请求永远继续下去(这是我第一次尝试时发生的事情)。我只想一次这个功能。
这是我的代码:
$("#calculateButton").ajaxComplete(function() {
$(this).unbind();
$(this).click();
});
所以我尝试做的是将ajaxComplete回调附加到calculate按钮。问题是每次ajax请求完成时都会执行此操作。而我想要的是在所有 AJAX请求完成时执行该函数。
有没有办法做到这一点。当我把它写出来时,听起来很复杂。我应该放弃并创建一个hacky work-around?
答案 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请求),请执行您想要执行的操作。
这是基本思路,实施相当简单。如果您对此有任何问题,请与我们联系。