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
相关产品推荐
相关产品推荐

