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

如何使用Promise等待异步函数执行完成后再运行后续代码?

问题原因

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

  • forEach循环内发起的17次数据库查询都是异步操作,不会阻塞后续代码执行,你在循环结束后立刻调用resolve()时,所有查询都还没有返回结果,eventData自然还没被写入数据
  • 你写的getEventData().then(console.log(eventData))本身语法逻辑错误:相当于调用getEventData的同时就立刻执行了console.log(eventData),不是等Promise状态变更后再执行
修复方案

建议用Promise.all收集所有异步查询的Promise,等待全部执行完成后再返回结果,不需要手动封装Promise实例,也不用依赖外部全局变量存储结果,写法更稳妥:

function getEventData() {
  // 用map收集每一次数据库查询返回的Promise
  const queryPromises = eventList.map((event) => {
    return db.collection('Events').doc(event)?.collection('registeredStudents')?.get()
      .then((querySnapshot) => {
        // 直接返回单条查询结果
        return {"id": event, "number": querySnapshot.size}
      })
  })
  // Promise.all会等待所有查询完成后,按顺序返回所有结果的数组
  return Promise.all(queryPromises)
}

// then中传入回调函数,等Promise完成后才会执行打印逻辑
getEventData().then((eventData) => {
  console.log(eventData)
  // 所有依赖eventData的后续逻辑都要写在这个回调内
})

如果一定要保留用外部变量存储eventData的写法,可以用下面的版本:

let eventData = []
function getEventData() {
  const queryPromises = eventList.map((event) => {
    return db.collection('Events').doc(event)?.collection('registeredStudents')?.get()
      .then((querySnapshot) => {
        eventData.push({"id": event, "number": querySnapshot.size})
      })
  })
  return Promise.all(queryPromises)
}

getEventData().then(() => {
  console.log(eventData)
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:57:02