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)
}

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

相关推荐
JarvanMo12 分钟前
Flutter 的默认颜色
前端
IT_陈寒13 分钟前
Vite打包时踩的坑:静态资源为啥突然404了?
前端·人工智能·后端
神奇的程序员10 小时前
我的软件冲进苹果商店下载榜前 50 了
前端
阳光是sunny10 小时前
别再被 worktree 绕晕了!AI 编程时代你必须掌握的 Git 隔离神器
前端·人工智能·后端
万少11 小时前
万少的博客 - 技术分享与解决方案
前端·javascript·后端
尘世中一位迷途小书童14 小时前
用 Cesium 撸了一个森林火情监控大屏,弧线、粒子、发光效果都齐了
前端·javascript
IT_陈寒14 小时前
垃圾回收器选错了,我的Java服务内存炸了
前端·人工智能·后端
月光下的丝瓜15 小时前
Flutter 国内安装指南
前端·flutter
先吃饱再说15 小时前
JavaScript中`this` 的“千层套路”:从默认绑定到箭头函数的五种指向
javascript
玄星啊15 小时前
AI 编程的第 30 天,我怀念古法 Coding 了
前端·ai编程