【问题标题】:Signal the end of a series of (n) AJAX calls发出一系列 (n) AJAX 调用结束的信号
【发布时间】:2012-12-18 15:10:58
【问题描述】:

我有一个网络应用程序,它在 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 调用。

我需要知道递归何时完成,但不知道该怎么做。

【问题讨论】:

  • 嗨,韦斯利,我有点困惑。为什么你不能在recursiveSiteSearch(rootWeb) 之后添加一行新代码,它可以对结果做任何你需要的事情。该行将在 recursiveSiteSearch 执行完成后执行。也许我理解错了——如果是这样,请给我一些关于您的应用如何工作以及您希望如何处理结果的详细信息。
  • 你如何使用承诺?请向我们展示一些实际代码。每个 Promise 库都有一个 all 函数或用于捆绑 Promise 的东西。
  • @Jonah 是的,这是正确的,但是因为最后 (n) 个 AJAX 调用可能会在最后一次递归结束后完成,所以我可能会错过数据。
  • @Bergi 调用是由 CMS 发布的专有库进行的。我们所做的只是在我们想要从中提取类型数据的每个子站点上调用 context.executeQueryAsync()
  • @Jonah AJAX 调用所有队列,甚至在一个返回之前。如果我在 resursiveSiteSearch 之后查询 objectThatHoldsAllResults.length,我得到 0。

标签: javascript ajax asynchronous promise


【解决方案1】:

简单地说,当执行到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 接口。

【讨论】:

  • 抱歉,我不在。我会立即尝试并告诉你它是如何工作的。
  • Wesley,您使用的是 SharePoint,对吗?如果是这样,那么您可能会发现将我的建议与您已经编写的代码合并起来很棘手。 SharePoint 可能会提供一个内置的 Promise 机制,但 SP API 的文档记录非常差,我预计很少有人会发现它,更不用说掌握它了。如果您编辑您的问题以提供有关recursiveSiteSearch() 内部发生的更多相关细节,我会看看我是否可以提供建议。
  • 谢谢甜菜根。你是对的,这是 SharePoint,看起来它依赖于 Microsoft AJAX 而不是 jQuery。目前我正在使用的是一个计数器,它为每次调用添加+1,并为每次成功或失败减去-1,并且到目前为止它正在工作。如果你想试一试,我可以在另一个线程中发布我的代码:)
  • Wesley,是的,试一试,并在此处发布指向新 Q 的链接。我无法做出任何承诺 [原文如此],因为我发现 SharePoint 的许多 API 难以理解,但我一定会看看。
猜你喜欢
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2014-09-10
  • 2011-10-24
相关资源
最近更新 更多