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

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

相关推荐
道可到5 分钟前
写了这么多代码,你真的在进步吗??—一个前端人的反思与全栈突围路线
前端
洛克大航海7 分钟前
Ajax基本使用
java·javascript·ajax·okhttp
用户9163574409510 分钟前
LeetCode热题100——11.盛最多水的容器
javascript·算法
凡大来啦25 分钟前
v-for渲染的元素上使用ref
前端·javascript·vue.js
道可到27 分钟前
前端开发的生存法则:如何从“像素工人”进化为价值创造者?
前端
eggcode27 分钟前
Vue前端开发学习的简单记录
vue.js·学习
中微子38 分钟前
TypeScript 泛型与 ReturnType 详解
前端
我叫张得帅38 分钟前
从零开始的前端异世界生活--003--“探究Domain,DNS,Hosting”
前端
一大树41 分钟前
H5在不同操作系统与浏览器中的兼容性挑战及全面解决方案
前端·ios
中微子43 分钟前
TypeScript never 类型详解
前端