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

JS for循环中fetch获取数据赋值给对象仅返回Promise的解决方法

问题根源

所有async标记的异步函数默认返回Promise对象,你在组装meals字段时没有await等待fetchMealDetails的请求结果,直接赋值自然只会存入Promise实例,而非接口返回的实际数据。

正确实现方案

批量异步请求推荐使用Promise.all并行处理,相比串行等待请求的写法效率更高,修改后的代码如下:

1. 改造日程解析方法

async parseMemberScheduleData(aSchedule) {
  // 收集每个日程项的处理Promise
  const schedulePromises = aSchedule.schedule.map(async (item) => {
    // 并行请求当前日程的所有餐食详情
    const [breakfast, secondBreakfast, lunch, dinner, supper] = await Promise.all([
      this.fetchMealDetails(item.breakfast),
      this.fetchMealDetails(item.secondBreakfast),
      this.fetchMealDetails(item.lunch),
      this.fetchMealDetails(item.dinner),
      this.fetchMealDetails(item.supper),
    ])
    // 所有请求完成后组装当前日程数据
    return {
      date: item.date,
      meals: {
        breakfast,
        secondBreakfast,
        lunch,
        dinner,
        supper
      },
      mealsId: {
        breakfast: item.breakfast,
        secondBreakfast: item.secondBreakfast,
        lunch: item.lunch,
        dinner: item.dinner,
        supper: item.supper
      }
    }
  })
  // 等待所有日程项处理完成,得到最终数组
  const arr = await Promise.all(schedulePromises)
  // 这里可以继续后续逻辑,比如把arr赋值给组件状态等
  console.log('处理完成的日程数据:', arr)
}

2. 调整调用逻辑

因为改造后的parseMemberScheduleData是异步方法,调用时如果需要等待处理完成再执行后续操作,可以添加await:

async function initPageData() {
  let a = { /* 你的原始JSON数据 */ }
  await this.parseMemberScheduleData(a)
  // 后续页面渲染逻辑
}

注意事项

  • 该方案会并发发起所有餐食详情请求,若你的服务端有QPS限制,可以调整为串行请求(在循环内依次await每个请求即可),但整体加载速度会变慢。
  • 若某一餐食的详情请求失败,目前的fetchMealDetails会返回undefined,你可以根据业务需求补充默认值兜底。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:06:05