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

如何正确返回含连续axios分页调用的Promise获取全量数据?

问题原因

你的代码拿不到返回值,核心是3个返回值透传的错误:

  1. performFetch 函数本身没有返回值。你只在axios.get()的.then()回调的else分支里写了return result,这个返回值仅属于then回调内部,不会传递到performFetch的外层;当存在下一页触发递归时,你也没有return递归调用的结果,整个performFetch执行完后没有任何显式返回,async函数无返回值时默认会返回Promise.resolve(undefined)。
  2. fetchResource里的.then((data) => {console.log('data?', data)}) 回调没有返回值,所以await这个Promise链拿到的结果自然是undefined。
  3. 你添加的.catch()块只打印错误、既不抛出错误也不返回有效值,会吞掉所有请求异常,外层既拿不到错误也拿不到正常结果。
修正方案

不需要靠传入对象修改引用的方式传值,直接把递归逻辑收敛到内部,保证每一层异步调用的结果都能顺着Promise链传到最外层即可,修正后的代码如下:

const fetchResource = async ({ type, search, page = 1 }) => {
  // 存储全量结果
  const mergedData = { count: 0, results: [] };

  // 内部递归拉取分页的方法
  const fetchPage = async (currentPage) => {
    const params = { page: currentPage };
    if (search) params.search = search;

    const { data } = await axios.get(`${type}/`, { params });
    // 拼接当前页数据
    mergedData.results.push(...data.results);
    mergedData.count = data.count;

    // 存在下一页就继续递归拉取,否则返回最终全量数据
    if (data.next) {
      return fetchPage(currentPage + 1);
    }
    return mergedData;
  };

  // 启动递归,返回最终结果的Promise
  return fetchPage(page);
};

调用方式

直接在外部用async/await或者.then()拿结果即可,错误建议放在最外层统一处理:

// 示例调用
try {
  const allData = await fetchResource({
    type: 'your_api_path',
    search: 'search_keyword',
    page: 1
  });
  console.log('全量拉取完成:', allData);
  // allData就是拼接完成的{count: 87, results: [...87条数据]}结构
} catch (err) {
  console.error('拉取失败:', err);
}
关键修改说明
  • 全程用async/await代替嵌套.then()写法,避免多层回调里return值无法透传的问题
  • 递归调用fetchPage时显式return,保证最终的结果能顺着调用链一直传递到最外层
  • 去掉了中间层吞错误的catch,把错误处理逻辑移到最外层调用处,避免异常被静默吃掉
  • 不需要额外把结果对象当参数传入递归函数,逻辑收敛更易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:03:18