reactjs - 在 foreach 中运行 firebase 请求,但希望等待结果继续进行(异步/等待不起作用)
问题描述
我正在使用 react useEffect 钩子,在该钩子中,我正在从 firebase 的 foreach 中获取数据,这没有什么奇怪的,这似乎可以正常工作。
我想等待 foreach 和 requests 完成,这样我的数组就会被构建,我可以在下面的代码中使用它。但似乎我的代码在继续之前没有等待(foreach 中的 console.log 最后显示在我的控制台中)。
useEffect(() => {
const unsubscribe = firebase
.locations()
.once('value')
.then(async snapshot => {
if (snapshot.val() !== null) {
const locationObject = snapshot.val()
const userInformation = []
await Object.keys(locationObject).forEach(element => {
firebase.user(element).once('value', userSnapshot => {
if (userSnapshot.val() !== null) {
console.log('inside location')
userInformation.push({
userId: 1,
name: userSnapshot.val().username
})
}
})
})
console.log('usrInfo', userInformation)
}
})
})
我在这里做错了什么?任何帮助,将不胜感激!
解决方案
该Object.keys(locationObject).forEach
代码不返回 a Promise
,因此调用await
它不会做任何事情。
如果您想等待多个 Promise 解决,您通常需要使用Promise.all
. 我通常还建议使用DataSnapshot.forEach()
而不是,Object.keys().forEach()
因为它维护子节点的顺序。
所以结合起来会变成这样:
const unsubscribe = firebase
.locations()
.once('value')
.then(async snapshot => {
let promises = [];
snapshot.forEach(element => {
promises.push(firebase.user(element.key).once('value'))
})
return Promise.all(promises);
}).then(snapshots => {
const userInformation = []
snapshots.forEach(userSnapshot => {
if (userSnapshot.exists()) {
userInformation.push({
userId: 1,
name: userSnapshot.val().username
})
}
})
console.log('userInfo', userInformation)
})
推荐阅读
- node.js - 如何确保即使在必填字段中没有给出数据,它也会认为是空的?
- reactjs - 未捕获的类型错误:无法读取未定义(DOM)的属性“就绪”
- php - 你将如何创建这个数据库?
- ruby-on-rails - Rails Active Storage 并非每次都工作。有时有效,有时无效
- node.js - 如何使用 jest 从测试向控制器发送数据?
- node.js - 可选链接在 Node 14 LTS 中不起作用?
- r - 为什么混淆矩阵的准确性不会随着我从 5 倍交叉验证增加到 100 倍交叉验证而改变?
- excel - ADDRESS 公式参数的含义
- flutter - 在 org.gradle.api.Projec 类型的项目“:app”上找不到参数 [build_1ebi9fgddm6fztg1dwfx76c67$_run_closure2@3e3a1649] 的方法 android()
- javascript - HTML Audio 在调用 audio.play() 后停止 IOS 音乐播放器