【发布时间】:2014-10-05 00:20:06
【问题描述】:
我正在使用 SharePoint REST Web 服务接口从网站获取大量数据。
这涉及到对不同服务的深度嵌套的 ajax 调用(即获取网站、获取列表、获取列表的所有项目、获取每个项目的属性、获取网站的子站点...重复)。
我正在使用一个 promise 数组,将每个调用都推送到数组中:
promises.push($.ajax({
url: fullurl,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: function (data) {
$.each(data.d.results, function(i, item) {
ProcessData(i,item, tableTarget, columns, promises);
});
},
error: function (data) {
console.log("request failed: " + fullurl);
}
}));
对 ProcessData 的每次调用都可能会在 html 表 ('tableTarget') 中添加一行并调用更多数据。
理想情况下,我想延迟尝试过滤表的脚本,直到所有数据都在那里。 问题是当我打电话给
var promises = [];
//kickoff my data gathering
AddWebData(url,tableTarget, promises);
//apply
$.when.apply($, promises).then(processFinalTable(promises));
promises 数组中只有大约 2 项,因此调用 processFinalTable 为时过早。 如果我耽误了
setTimeout(函数(){
console.log('等待 4000');
$.when.apply($, promises).then(processFinalTable(promises));
}, 4000);
promises 列表有 400 个左右的项目。总的来说,我实际上需要等待 1200 个奇怪的 ajax 调用(不要问)。
鉴于我将根据 SharePoint 网站数据进行任意数量的调用。如何确定我的最后一个异步调用何时完成?
【问题讨论】:
-
你可以让每个回调 clearTimeout() 和 setTimeout(done, 500); ,其中 done 是一个排序的函数。这样一来,URL 通常会逐步进入并通过重新延迟来阻止排序。如果它停顿了一下,就会调用排序,因为它会在连接恢复后调用。如果排序是非破坏性的或发生在“折叠之下”,你甚至不需要每次都重新绘制,最坏的情况是,你每秒只绘制两次,延迟为 500 毫秒。提到的 500 毫秒实际上应该不超过这些 ajax 请求的平均周转时间的两倍左右。
-
我可能会将其作为最后的解决方法。
标签: jquery ajax asynchronous sharepoint-2013