发出一系列(n)AJAX调用结束的信号

时间:2013-01-04 07:11:19

标签: javascript ajax asynchronous promise

我有一个Web应用程序,可以在CMS中抓取网站并查找某种类型的数据。

它的工作原理很像递归文件/目录循环:

//pseudo code
var rootWeb = context.site.rootWeb();
var objectThatHoldsAllResults;
recursiveSiteSearch(rootWeb);

function recursiveSiteSearch(webSite) {
   //Get all content of a certain type and add to objectThatHoldsAllResults
   //Get all SubSites and throw them into a loop that runs recursiveSiteSearch
}

此应用程序存在于云中,并且不知道访问它的每个CMS中有多少子站点。

每次循环获取某种类型的所有内容时,它都会对网站进行AJAX调用。

我需要知道递归何时完成,但不知道如何这样做。

1 个答案:

答案 0 :(得分:2)

直截了当地,当执行到recursiveSiteSearch(rootWeb);之后的语句时,递归将结束。

然而,recursiveSiteSearch内的异步性(ajax)可能/意志(?)意味着某些潜在活动仍然存在。

因此,您似乎需要一种机制来检测所有承诺(即在递归中启动的所有ajax请求)何时完成。

jQuery,提供了这样一种机制。

伪代码:

function recursiveSiteSearch(webSite) {
    //Get all content of a certain type and add to objectThatHoldsAllResults
    //Get all SubSites and throw them into a loop that runs recursiveSiteSearch
    //Within the loop, push jqXHR objects onto the externally declared `promises` array.
}

var rootWeb = context.site.rootWeb();
var objectThatHoldsAllResults;
var promises = [];
recursiveSiteSearch(rootWeb);
jQuery.when.apply(jQuery, promises).done(function() {
    //statements here will execute when 
    //recursion has finished and all ajax 
    //requests have completed.
});

这应该起作用的原因是jqXHR objects(由jQuery.ajax()及其简写形式返回)实现了jQuery的Promise接口。