You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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) { /* 错误处理逻辑 */ }
);

修复说明

  1. 移除手动创建的new Promise,直接返回$.ajax的Promise,简化异步流程
  2. 递归调用时return getAllItemsFromList(data.d.__next),将所有异步请求串联成完整的Promise链
  3. 只有当最后一页数据处理完成后,整个Promise链才会变为resolved状态,触发外层的.then()逻辑

内容的提问来源于stack exchange,提问作者Sven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:50:10