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

如何在.map循环中调用fetch获取API数据并正确返回结果

问题根因

你写的代码存在两个核心问题:

  • map的回调函数没有显式返回值:回调内部执行了fetch逻辑,但没有将fetch返回的Promise对象return出去,最终map生成的数组所有元素都是undefined
  • fetch是异步IO操作:就算你补全了return语句,直接拿到的也只是Promise对象组成的数组,不是接口返回的实际数据,必须等待所有异步操作执行完成才能拿到最终结果
实现方案

方案1:Promise.all + then 链式调用

// 先遍历生成Promise数组
const promiseArr = urls.map(url => {
  // 显式return fetch返回的Promise
  return fetch(url)
    .then(response => response.json())
    .catch(err => {
      console.log(err)
      // 可选:单个接口报错时返回兜底值,避免影响其他接口的结果获取
      return null
    })
})

// 等待所有Promise执行完成,拿到最终结果数组
Promise.all(promiseArr).then(allData => {
  // 此处的allData就是所有接口返回的JSON数据组成的数组
  console.log(allData)
})

方案2:async/await 语法糖(可读性更高)

async function fetchAllData(urls) {
  const promiseArr = urls.map(async url => {
    try {
      const res = await fetch(url)
      return await res.json()
    } catch (err) {
      console.log(err)
      return null
    }
  })
  // 等待所有异步请求完成
  const allData = await Promise.all(promiseArr)
  return allData
}

// 调用方法
fetchAllData(urls).then(allData => {
  console.log(allData)
})
注意事项
  • 如果要求所有接口都成功才返回结果,任意一个接口报错就中断流程,可以去掉单个fetch的catch捕获,统一在Promise.all后面加catch处理错误即可
  • Promise.all的执行顺序和传入的Promise数组顺序一致,最终返回的结果数组顺序和原始urls数组顺序完全对应

内容的提问来源于stack exchange,提问作者ByAdham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:48:03