仅在完成多个AJAX请求后才触发函数

我有一个特定的函数,我想运行一次,并且只有在完成几个AJAX请求之后。

我目前的解决方案看起来有点像这样:

function doWork() { //This is the function to be run once after all the requests } //some tracking/counting variables var ajaxDoneCounter = 0; var numOfAjaxRequests = 5; var workDone = false; function doWorkTrigger() { ajaxDoneCounter++; if( !workDone && ajaxDoneCounter >= numOfAjaxRequests ) { workDone = true; doWork(); } } // ... //and a number of ajax requests (some hidden within functions, etc) //they look something like this: $.ajax({ url: "http://www.example.com", dataType: "json", success: function( data ) { //load data in to variables, etc doWorkTrigger(); } }); 

上面的一个明显缺陷是,任何不成功的AJAX调用都不会增加ajaxDoneCount ,因此doWork()可能永远不会被调用。 我可以使用任何$.ajaxerror回调来解决这个问题,所以这并不会让我太担心。

我想知道的是上述是否安全和/或良好的做法?
有没有我错过的技巧,或者其他可能更好的东西?

更新:自jQuery 1.5以来, 延迟对象 [docs]提供了更清晰的解决方案。 看看这里的一个例子 。


我会使用.ajaxComplete() ,只要Ajax调用完成(成功或错误),它就会被触发:

 var numOfAjaxRequests = 5; $(document).ajaxComplete(function() { numOfAjaxRequests--; if(!numOfAjaxRequests) { doWork(); } }); 

然后您不必编辑每个Ajax请求。

您甚至可以使用.ajaxSend()来获取启动Ajax请求的通知,而不是硬编码(但我不确定这是否真的有效,也许您会遇到竞争条件):

 var numOfAjaxRequests = 0; $(document).ajaxSend(function() { numOfAjaxRequests++; }); 

我认为你应该使用complete(XMLHttpRequest, textStatus) ajax事件而不是成功(data,textStatus,XMLHttpRequest)。

根据jQuery的帮助:

 complete(XMLHttpRequest, textStatus) 

请求完成时要调用的函数(执行成功和错误回调之后)。 该函数传递两个参数:XMLHttpRequest对象和描述请求状态的字符串。 这是一个Ajax事件。

我对JavaScript内部知识不够了解,但操作有危险:

 ajaxDoneCounter++; 

不是primefaces的。 如果是这种情况,那么这可能会受到竞争条件的影响。