JS中递归拉取分页API全量数据的实现问题求助
拉取全量分页API的JS实现方案
核心问题
现有代码仅实现了单页数据的拉取逻辑,缺少递归分页、结果合并、终止判断三个核心环节,因此只能拿到第一页的100条数据,且递归逻辑没有终止条件会导致进程持续后台运行。
前提说明
你需要先确认bookGenie.find的返回结构,以下实现默认适配两种常见返回格式:
- 直接返回当前页的书籍数组
- 返回带分页信息的对象:
{ 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
相关产品推荐
相关产品推荐

