forEach 和 for...of... 在遍历内部存在异步操作的区别

起先是因为一段代码:

js 复制代码
const formatUserInfo = async (id) => {
  const result = await getUserInfoByIdAPI(id)
  return result.data.data
}
const getReturnSchoolInfoList = async () => {
  const result = await getReturnSchoolInfoListAPI(page.value, limit.value)
  count.value = result.data.data.count
  returnSchoolInfoList.value = result.data.data.rows
  // todo 根据userId 获取用户信息 并与返校信息合并
  returnSchoolInfoList.value.forEach(item => {
    const result1 = await formatUserInfo(item.userId)
    console.log(result1)
    item.userInfo = result1
  })
  console.log(returnSchoolInfoList.value)
}

然后报错: vite Internal server error: vue/compiler-sfc Unexpected reserved word 'await'.。

如果去掉 await ,那么由于是异步操作会先输出 returnSchoolInfoList.value,再输出 result1,并且因为赋值的时候并没有获取到result1 的具体值,所以需等待该异步操作完成后再进行赋值。

然后幸好有 Webstorm 的智能提示,让我使用 for...of... 代替 forEach,bug 果然消失了 !

js 复制代码
const formatUserInfo = async (id) => {
  const result = await getUserInfoByIdAPI(id)
  return result.data.data
}
const getReturnSchoolInfoList = async () => {
  const result = await getReturnSchoolInfoListAPI(page.value, limit.value)
  count.value = result.data.data.count
  returnSchoolInfoList.value = result.data.data.rows
  // todo 根据userId 获取用户信息 并与返校信息合并
  for (const item of returnSchoolInfoList.value) {
    const result1 = await formatUserInfo(item.userId)
    console.log(result1)
    item.userInfo = result1
  }
  console.log(returnSchoolInfoList.value)
}

并且等待异步完成后,正确赋值了!

相关推荐
IT_陈寒9 分钟前
Redis误用keys命令把生产环境搞崩了,血的教训
前端·人工智能·后端
计算机魔术师21 分钟前
5000亿估值冲刺科创板,DeepSeek 为何急着上市?
前端
我血条子呢26 分钟前
前端解析word方案
前端·word
kyriewen36 分钟前
我用 AI 写完一个需求后才发现,最难的不是 prompt,而是验收
前端·程序员·ai编程
申行39 分钟前
Vue 3 + DYMO Connect Framework 实战:从标签模板到打印服务的完整实现
前端
两只羊ovo40 分钟前
Vue 3 + DeepSeek 流式输出实战:从“干等”到“打字机”体验
前端·vue.js
Yeyu43 分钟前
车载多 App 同屏渲染(二):SurfaceControlViewHost 跨进程
前端
樊小肆43 分钟前
离谱,每轮请求 25% 的 token,竟在重发模型想完就扔的内心独白
前端·人工智能·agent
小妖现世1 小时前
前端面试复习笔记:React 高频题 + JS 手写题
前端
holidaypenguin1 小时前
Windows 本地 HTTPS 证书生成指南
前端