使用__next分页获取ProjectData API全部TaskName失败求助
解决Project Data REST API分页获取所有TaskName的问题
你的问题很清晰:已经成功识别出__next分页URL,但代码只处理了第一页的数据,没有继续请求后续页面。核心问题在于你只是打印了下一页的URL,却没有实际发起新的请求去获取那一页的任务数据。
修复方案:用递归函数处理分页请求
我们可以把数据请求的逻辑封装成一个可复用的函数,当检测到存在下一页时,递归调用这个函数来获取后续数据。这样就能自动遍历所有分页,输出每一页的TaskName。
修改后的完整代码如下:
// 封装获取任务数据的函数,支持分页递归 function fetchTasks(url) { $.ajax({ url: url, method: "GET", dataType: "json", headers: { Accept: "application/json;odata=verbose" }, success: function(data) { // 遍历当前页的所有任务,打印TaskName $.each(data.d.results, function(key, value) { console.log(value.TaskName); }); // 检查是否存在下一页,如果有就继续请求 if (data.d.__next) { console.log("正在获取下一页,URL: " + data.d.__next); fetchTasks(data.d.__next); } else { console.log("🎉 所有任务数据已全部获取完成"); } }, error: function(xhr, status, error) { console.error("请求失败: " + error); } }); } // 页面加载完成后,发起初始请求 window.addEventListener('load', function() { const initialApiUrl = _spPageContextInfo.siteAbsoluteUrl + "/_api/ProjectData/[en-US]/Tasks"; fetchTasks(initialApiUrl); });
代码说明
- 封装可复用函数:
fetchTasks函数负责发起请求并处理响应,接受一个URL参数——初始调用时传第一页的API地址,后续调用传__next的URL。 - 处理当前页数据:在success回调里,先遍历当前页的
results数组,打印每个任务的TaskName。 - 递归处理分页:如果响应里存在
data.d.__next,就把这个URL传给fetchTasks,继续获取下一页数据;如果没有,说明所有数据都获取完了。 - 错误处理:加上了error回调,方便调试请求失败的情况(比如权限问题、API地址错误等)。
注意事项
- 确保页面已经加载了jQuery,否则
$.ajax会报错(SharePoint页面一般默认会加载jQuery,但如果是自定义页面需要手动引入)。 - 如果你的任务数据量极大(比如数千条),递归可能会有调用栈溢出的风险,这种情况下可以改用
async/await结合循环的方式实现,但对于大多数场景来说,递归已经足够简单好用。
内容的提问来源于stack exchange,提问作者Mohamed Khlifi
相关产品推荐
相关产品推荐

