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

如何在需动态循环的函数中使用async/await?NodeJS分页API请求问题

解决多次API调用获取完整数据的Promise问题

你的代码核心问题在于**getDataFromLoop没有正确返回Promise**,而且递归调用时没有处理异步链,导致await无法拿到最终结果。另外全局的loopArray也容易引发数据冲突,我们来一步步修正:

问题拆解

  1. 原函数没有返回Promise,await相当于等待一个undefined,自然拿不到数据
  2. 递归调用时没有等待递归的异步操作完成,也没有合并递归返回的结果
  3. 全局数组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:16