firebase on ('value') с await не работает должным образом - PullRequest
0 голосов
/ 23 мая 2018

Я собираюсь построить функцию, чтобы дождаться, пока все значения в 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)

Но я использовал await в этой функции

  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)

1 Ответ

0 голосов
/ 23 мая 2018

Функция on() Firebase будет постоянно прослушивать местоположение, в котором вы их вызываете.Это означает, что они могут предоставить вам данные несколько раз.Поскольку 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
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...