Javascript 带wait的firebase on(';value';)无法按预期工作
我希望构建函数,直到on('value')中的所有值都被设置,然后转到下一行,换句话说,异步函数Javascript 带wait的firebase on(';value';)无法按预期工作,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我希望构建函数,直到on('value')中的所有值都被设置,然后转到下一行,换句话说,异步函数 let upcomingGamesList = await firebase.database().ref('UpcomingGames').on('value', snapshot => { upcomingGamesList = snapshot.val() console.log('upcoming t1',upcomingGamesList)
let upcomingGamesList = await firebase.database().ref('UpcomingGames').on('value', snapshot => {
upcomingGamesList = snapshot.val()
console.log('upcoming t1',upcomingGamesList)
return upcomingGamesList
})
console.log('upcoming t2',upcomingGamesList)
let upcomingPreferences = upcomingGamesList.map(async(game) => {
console.log(game)
let GameId = game.GameId
await firebase.database().ref(`GameNotificationPreferances/${GameId}`).orderByKey().equalTo(UserStore.user.uid).once('value', snapshot => {
if (snapshot.val() != null || snapshot.val() != undefined) {
conosle.log(snapshot.val())
} else {
console.log('not value')
}
})
console.log(game)
})
发生的是即将到来的t2
console.log('upcoming t2',upcomingGamesList)
在即将到来的t1之前打印
console.log('upcoming t2',upcomingGamesList)
但是我在这个函数中使用了wait
let upcomingGamesList = await firebase.database().ref('UpcomingGames').on('value', snapshot => {
upcomingGamesList = snapshot.val()
console.log('upcoming t2',upcomingGamesList)
return upcomingGamesList
})
它应该等到它完成,然后转到下一行
我想等待函数完成,然后用我所做的更改获取updatedList
let upcomingGamesList = await firebase.database().ref('UpcomingGames').on('value', async(snapshot) => {
upcomingGamesList = snapshot.val()
updatededList = await upcomingGamesList.map(async(game) => {
let GameId = game.GameId
await firebase.database().ref(`GameNotificationPreferances/${GameId}`).orderByKey().equalTo(UserStore.user.uid).once('value', async(snapshot) => {
if (snapshot.val() != null || snapshot.val() != undefined) {
game['reminderPressed'] = true;
} else {
game['reminderPressed'] = false
}
console.log('GameId:',GameId, 'GameDetails:',game)
return ({...game})
})
})
})
console.log('the updatedList is',updatededList)
Firebase的on()
函数将持续监听您调用它们的位置。这意味着他们可以多次向您提供数据。由于Promise
只能解析一次,因此on()
不会返回承诺。因此它不能与async
/wait
一起使用
在这种情况下,您可能希望使用one()
,其工作原理基本相同,但只提供一次结果(并因此返回一个承诺):
这对我有用
export const deviceLogin=async(pin)=>{
var ref=firebase.database().ref(`/devices/${pin}`);
const snapshot=await ref.once('value');
返回snapshot.val();
}
嘿,我更新了我的问题,你能解释一下在所有更改之后我如何获得更新列表吗?在你的回答中,你使用一次,我想使用ref(“UpcomingGames”),在ref(“GameNotificationPrefences”)下使用一次。因为如果ref(‘upcomingGames’)中有任何更改,我想再次运行该函数
let upcomingGamesList = await firebase.database().ref('UpcomingGames').once('value', snapshot => {
upcomingGamesList = snapshot.val()
console.log('upcoming t2',upcomingGamesList)
return upcomingGamesList
})