如何在需动态循环的函数中使用async/await?NodeJS分页API请求问题
解决多次API调用获取完整数据的Promise问题
你的代码核心问题在于**getDataFromLoop没有正确返回Promise**,而且递归调用时没有处理异步链,导致await无法拿到最终结果。另外全局的loopArray也容易引发数据冲突,我们来一步步修正:
问题拆解
- 原函数没有返回Promise,
await相当于等待一个undefined,自然拿不到数据 - 递归调用时没有等待递归的异步操作完成,也没有合并递归返回的结果
- 全局数组
loopArray会在多次请求时互相干扰
正确实现方式
我们把request包装成Promise,并用递归+async/await来处理分页逻辑,同时把数据收集放在函数内部避免全局污染:
app.post('/api/fetchData', async function(req, res) { try { const totalData = await getDataFromLoop(token, ''); // 拿到完整数据后返回给前端 res.json(totalData); } catch (e) { console.log('Exception', e); res.status(500).json({ error: e.message }); } }); // 把回调式的request包装成Promise工具函数 function makeApiRequest(accessToken, counter = '') { return new Promise((resolve, reject) => { request({ url: 'API URL', // 替换成你的实际API地址 auth: { 'bearer': accessToken }, // 注意:这里要把counter(offset)传递给API,根据接口要求选择query/body // 示例:qs: { offset: counter } 或者 body: { offset: counter } }, function(err, response) { if (err) { return reject(err); } try { const res_data = JSON.parse(response.body); resolve(res_data); } catch (parseErr) { reject(parseErr); } }); }); } // 递归获取完整数据的异步函数 async function getDataFromLoop(accessToken, counter = '', collectedData = []) { const res_data = await makeApiRequest(accessToken, counter); // 合并当前页的数据到收集数组 collectedData.push(...res_data.data); // 判断是否还有更多数据需要获取 if (res_data.hasOwnProperty('hasMore') && res_data.hasMore) { // 递归调用,传递新的offset和已收集的数据 return getDataFromLoop(accessToken, res_data.offset, collectedData); } else { // 所有数据获取完成,返回完整结果 return collectedData; } }
关键改进点
- Promise包装:把回调式的
request转换成Promise,这样才能用await等待请求完成 - 递归异步处理:递归调用时用
return传递Promise链,确保上层await能等待所有递归操作完成 - 避免全局变量:用函数参数
collectedData维护收集的数据,每次请求都是独立的,不会互相干扰 - 完善错误处理:新增了JSON解析的错误捕获,以及接口请求的错误处理,避免静默失败
这样修改后,await getDataFromLoop(token, '')就能正确拿到所有分页的数据了。
内容的提问来源于stack exchange,提问作者Anirudh
相关产品推荐
相关产品推荐

