Запускаем запрос firebase в foreach, но хотим дождаться продолжения результата (async / await не работает) - PullRequest
0 голосов
/ 30 сентября 2019

Я использую ловушку реагирования useEffect, и внутри этой ловушки я извлекаю данные в foreach из firebase, здесь нет ничего странного, и, похоже, это работает.

Я хочу дождаться foreach и запросов назакончить, так что мой массив будет построен, и я могу использовать его в следующем коде. Но, похоже, мой код не ждет, прежде чем продолжить (console.log внутри foreach отображается последним в моей консоли).

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

Что я здесь не так делаю? Любая помощь будет оценена!

1 Ответ

0 голосов
/ 30 сентября 2019

Код Object.keys(locationObject).forEach не возвращает Promise, поэтому вызов await для него ничего не даст.

Если вы хотите дождаться разрешения нескольких обещаний, выобычно хотят использовать 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)
  })
...