如何用nextPageToken循环调用Promise?求无重复代码方案
解决重复Promise链式调用的分页问题
嗨,我懂你现在的烦恼——重复写一堆几乎一模一样的.then()块不仅冗余,还没法灵活控制循环的开始和结束。这里有两种简洁的解决方案,帮你彻底摆脱重复代码:
方案1:用递归函数封装分页逻辑(基于原生Promise)
我们可以把分页的逻辑封装成一个递归函数,它会自动判断是否需要加载下一页,直到没有nextPageToken为止:
function load() { const search_this_q = "cats"; // 递归处理分页的函数 function fetchPage(pageToken = null) { let searchPromise; if (pageToken) { // 有分页token时,调用下一页搜索接口 searchPromise = next_Page_Search(pageToken, search_this_q); } else { // 无token时,调用初始搜索接口 searchPromise = search(search_this_q); } return searchPromise .then(result => { console.log("加载到一页数据"); // 如果还有下一页,继续递归调用 if (result.nextPageToken) { return fetchPage(result.nextPageToken); } // 没有下一页了,返回最终结果 return result; }); } // 启动分页加载流程 fetchPage() .then(finalResult => { console.log("所有分页加载完成:", finalResult); }) .catch(error => { console.error("加载过程出错:", error); }); }
这个方案的优势:
- 完全消除重复代码,所有分页逻辑集中在一个函数里
- 自动终止循环,不用手动写N个
.then() - 易于维护,后续修改分页规则只需要调整
fetchPage函数
方案2:用async/await实现直观的循环(推荐)
如果你习惯用async/await语法,代码会更接近同步逻辑,可读性拉满:
async function load() { const search_this_q = "cats"; let pageToken = null; let finalResult; try { while (true) { // 根据是否有分页token,选择对应的搜索接口 const result = pageToken ? await next_Page_Search(pageToken, search_this_q) : await search(search_this_q); console.log("加载到一页数据"); finalResult = result; // 没有下一页token就退出循环 if (!result.nextPageToken) { break; } // 更新token为下一页的标识 pageToken = result.nextPageToken; } console.log("所有分页加载完成:", finalResult); } catch (error) { console.error("加载过程出错:", error); } }
这种写法的好处:
- 逻辑一目了然,和普通的while循环写法几乎一致
- 用try/catch统一处理错误,比Promise的
.catch()更符合同步代码的思维习惯
额外提醒
- 注意确认
search和next_Page_Search的参数顺序,我是按照你原代码的调用方式写的,如果实际接口参数不同,记得调整 - 可以添加额外的终止条件,比如限制最大加载页数(比如加个
maxPages变量,循环次数超过就停止),避免因接口异常导致无限循环
内容的提问来源于stack exchange,提问作者 juv
相关产品推荐
相关产品推荐

