使用jQuery递归AJAX调用SharePoint REST API获取列表项遇.then()失效问题
问题分析与修复方案
问题原因
当SharePoint列表存在分页(data.d.__next存在)时,你在递归调用getAllItemsFromList(url)后,没有将递归产生的Promise与外层Promise关联。最初调用的Promise始终无法触发resolve,导致.then()中的逻辑永远不会执行。
修复后的代码
重构函数,利用jQuery AJAX本身返回的Promise构建链式调用,避免手动创建Promise时的关联问题:
var url = _spPageContextInfo.webServerRelativeUrl + "/_api/web/lists/getbytitle('LISTNAME')/items?$select=ID,Title,TEST,LINK,Modified,Editor/Title&$top=5000&$expand=Editor/Id"; function getAllItemsFromList(url) { return $.ajax({ url: url, method: "GET", dataType: "json", headers: { "Accept": "application/json; odata=verbose" }, }).then(function (data) { // 将当前页数据存入数组 data.d.results.forEach(element => { all_items_from_list.push(element); }); if (data.d.__next) { console.log("true: ", data.d.results); // 递归调用并返回Promise,延续链式调用 return getAllItemsFromList(data.d.__next); } else { console.log("false: ", data.d.results); console.log("false, all_items_from_list: ", all_items_from_list); // 所有数据获取完成,返回标记值 return "yay"; } }).fail(function () { console.log("this went horribly wrong!"); throw new Error("ERROR!"); }); }; var all_items_from_list = []; getAllItemsFromList(url).then( function (value) { console.log("I'm here and got following data: ", all_items_from_list) }, function (error) { /* 错误处理逻辑 */ } );
修复说明
- 移除手动创建的
new Promise,直接返回$.ajax的Promise,简化异步流程 - 递归调用时
return getAllItemsFromList(data.d.__next),将所有异步请求串联成完整的Promise链 - 只有当最后一页数据处理完成后,整个Promise链才会变为resolved状态,触发外层的
.then()逻辑
内容的提问来源于stack exchange,提问作者Sven
相关产品推荐
相关产品推荐

