如何拼接SharePoint多AJAX调用结果到单变量供jQuery DataTables使用
问题根因
- 初始版本:
for循环每次迭代都会覆盖yearh1、yearh2变量,最终$.when()仅监听了2021年的2个请求,前几年的请求完成不会触发渲染,因此只能拿到2021年数据。 - 优化版本:
$.when()不支持直接传入请求数组,必须将数组展开后传入,你额外传入的$属于冗余参数,导致渲染触发时大部分请求还未返回,无法拿到全量拼接结果。
修正后可用代码
var allResults = []; var allRequests = []; $(document).ready(function () { load(); }); function load() { for (let year = 2016; year < 2022; year++) { // 上半年请求 var yearh1 = $.ajax({ url: "SPO_Site/_api/web/lists/getbytitle('List_Name')/items?$top=5000&$select=*&$filter=(Incident_x0020_Date ge datetime'"+(year-1)+"-12-31T20:00:00.000Z') and (Incident_x0020_Date lt datetime'"+year+"-06-01T00:00:00.000Z')", type: "GET", dataType: "json", headers: {"accept": "application/json;odata=verbose"}, success: mySuccHandler, error: myErrHandler }); // 下半年请求 var yearh2 = $.ajax({ url: "SPO_Site/_api/web/lists/getbytitle('List_Name')/items?$top=5000&$select=*&$filter=(Incident_x0020_Date ge datetime'"+year+"-06-01T00:00:00.000Z') and (Incident_x0020_Date le datetime'"+year+"-12-31T00:00:00.000Z')", type: "GET", dataType: "json", headers: {"accept": "application/json;odata=verbose"}, success: mySuccHandler, error: myErrHandler }); allRequests.push(yearh1); allRequests.push(yearh2); } function mySuccHandler(res) { // 简化拼接逻辑,直接合并结果 allResults = allResults.concat(res.d.results); } function myErrHandler(data, errorCode, errorMessage) { console.log("请求失败: " + errorMessage); }; // 核心修正:用apply展开请求数组,确保所有12个请求全部完成后再渲染表格 $.when.apply($, allRequests).done(function(){ $('#table_id').DataTable({ data: allResults, dom: 'Bfrtip', columns: [ { data: "Title" }, { data: "Reg_x0020_No" } ] }); }); };
额外优化建议
如果后续数据量继续增长,还可以在$filter中补充$orderby=ID asc,结合$skiptoken做分页,无需手动按时间拆分请求,也能突破5000条阈值。
内容的提问来源于stack exchange,提问作者Jackson Christopher
相关产品推荐
相关产品推荐

