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

Firestore获取生日数据时await与Promise未按预期工作排查

问题分析

你的代码存在两个核心问题,导致console.log没输出预期内容:

  • 未等待Firestore异步查询完成:db.collection(...).get()返回Promise,但你用then处理时,没有用await等待这个Promise执行完毕,就直接执行后续代码。此时birthdaysArr还是空数组,因为then里的回调还没来得及执行。
  • 错误使用Promise.all:Promise.all需要接收Promise数组,但你传入的birthdaysArr是存储普通数据的数组,初始为空,所以await Promise.all(birthdaysArr)会直接resolve为空数组,完全起不到等待异步查询的作用。
修正后的代码
async function getFirestoreBirthdays() {
    let db = firebase.firestore();
    var birthdaysArr = []

    // 等待Firestore查询完成
    const querySnapshot = await db.collection("birthdays").orderBy("date", "desc").get();
    
    querySnapshot.forEach((doc) => {
        birthdaysArr.push(doc.data());
    })

    console.log(birthdaysArr)
    // 此处可直接执行UI更新逻辑,比如调用渲染函数
    // renderBirthdays(birthdaysArr);
}

更简洁的写法(用map直接转换数据):

async function getFirestoreBirthdays() {
    let db = firebase.firestore();

    const querySnapshot = await db.collection("birthdays").orderBy("date", "desc").get();
    const birthdaysArr = querySnapshot.docs.map(doc => doc.data());
    
    console.log(birthdaysArr);
    // 执行UI更新
}
关键说明
  • 用await直接等待Firestore的get()方法返回的Promise,确保查询完成后再处理数据。
  • 此处无需Promise.all,因为只有单个异步操作(Firestore查询),不存在多个Promise并行等待的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:18:22