【问题标题】:firebase on('value') with await does not work as expected带有等待的firebase on('value')无法按预期工作
【发布时间】:2018-11-02 20:52:17
【问题描述】:

我正在寻找构建函数以等待 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)

但我在这个函数中使用了等待

  let upcomingGamesList = await firebase.database().ref('UpcomingGames').on('value', snapshot => {
        upcomingGamesList = snapshot.val()
        console.log('upcoming t2',upcomingGamesList)
        return upcomingGamesList
    })

它应该等到它完成然后转到下一行

我想等到函数完成,然后通过我所做的更改获取更新列表

 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)

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    这对我有用

    export const deviceLogin = async (pin) => {
        var ref = firebase.database().ref(`/devices/${pin}`);
        const snapshot = await ref.once('value');
        return snapshot.val();
    }
    

    【讨论】:

      【解决方案2】:

      Firebase 的 on() 函数将持续监听您调用它们的位置。这意味着他们可以多次为您提供数据。由于Promise 只能解析一次,on() 不会返回承诺。因此它不能与async/await一起使用。

      在这种情况下,您似乎想要使用once(),它的工作原理几乎相同,但只会提供一次结果(因此返回一个承诺):

      let upcomingGamesList = await firebase.database().ref('UpcomingGames').once('value', snapshot => {
          upcomingGamesList = snapshot.val()
          console.log('upcoming t2',upcomingGamesList)
          return upcomingGamesList
      })
      

      【讨论】:

      • 嘿,我更新了我的问题,你能解释一下我如何在所有更改后获取 updatedList 吗?
      • 在您使用一次的答案中,我想使用 ref('UpcomingGames') 并在 ref('GameNotificationPrefences') 下使用一次。因为如果 ref('upcomingGames') 有任何变化,我想再次运行该函数
      猜你喜欢
      • 2023-03-03
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2019-12-29
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      相关资源
      最近更新 更多