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

JS中递归拉取分页API全量数据的实现问题求助

拉取全量分页API的JS实现方案

核心问题

现有代码仅实现了单页数据的拉取逻辑,缺少递归分页、结果合并、终止判断三个核心环节,因此只能拿到第一页的100条数据,且递归逻辑没有终止条件会导致进程持续后台运行。

前提说明

你需要先确认bookGenie.find的返回结构,以下实现默认适配两种常见返回格式:

  1. 直接返回当前页的书籍数组
  2. 返回带分页信息的对象:{ list: 当前页书籍数组, total: 总记录数 }

完整实现代码

async function getAllBooks() {
  const allBooks = [];
  const PAGE_SIZE = 100;

  // 递归拉取分页数据
  async function fetchByOffset(offset = 0) {
    const pageRes = await bookGenie.find('fiction', PAGE_SIZE, offset);
    // 适配不同返回结构,取出当前页数据
    const currentPageList = Array.isArray(pageRes) ? pageRes : (pageRes.list || []);
    allBooks.push(...currentPageList);

    // 递归终止条件:当前页返回数据量小于页长,说明已经拉完全量数据
    // 如果接口返回total字段,也可以用 allBooks.length >= pageRes.total 作为终止条件
    if (currentPageList.length < PAGE_SIZE) {
      return;
    }

    // 拉取下一页
    await fetchByOffset(offset + PAGE_SIZE);
  }

  await fetchByOffset();
  return allBooks;
}

// 调用示例
getAllBooks()
  .then(fullBookList => {
    // 全量数据处理逻辑
    console.log(`拉取完成,共${fullBookList.length}条记录`);
  })
  .catch(err => {
    console.error('拉取失败:', err);
  });

异常场景优化

  • 避免触发API限流:可在每次调用bookGenie.find前添加延迟逻辑,比如await new Promise(resolve => setTimeout(resolve, 500)),根据API限流规则调整延迟时长
  • 偶发请求失败重试:可给单页拉取逻辑增加重试次数,避免网络波动导致全量拉取中断
  • 死循环排查:如果进程仍持续运行,检查接口是否在无数据时仍返回空元素凑够100条,可将终止条件调整为currentPageList.filter(item => !!item).length === 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:45:03