Javascript 带wait的firebase 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)

我希望构建函数,直到on('value')中的所有值都被设置,然后转到下一行,换句话说,异步函数

 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
})