如何正确返回含连续axios分页调用的Promise获取全量数据?
问题原因
你的代码拿不到返回值,核心是3个返回值透传的错误:
performFetch函数本身没有返回值。你只在axios.get()的.then()回调的else分支里写了return result,这个返回值仅属于then回调内部,不会传递到performFetch的外层;当存在下一页触发递归时,你也没有return递归调用的结果,整个performFetch执行完后没有任何显式返回,async函数无返回值时默认会返回Promise.resolve(undefined)。fetchResource里的.then((data) => {console.log('data?', data)})回调没有返回值,所以await这个Promise链拿到的结果自然是undefined。- 你添加的
.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
相关产品推荐
相关产品推荐

