React Native - Firebase - Два связанных вызова - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь получить все данные перед рендерингом экрана.

У меня есть Магазины и Пользователи .

Пользователи могут добавить в избранное магазин.Один пользователь может иметь более одного магазина в своих избранных.

Первый шаг - получение всех избранных текущего пользователя.Возвращаемые данные выглядят примерно так:

[1, true],
[2, false],
[3, false],
[4, false],

Примечание: true и false указывают, хотят ли пользователи получать уведомления об этом любимом магазине, и не влияют на поведение процесса.

После получения избранногоМагазин пользователя, мне нужно получить информацию о магазине, поэтому я сделал цикл для каждого любимого магазина.

Этот код работает, но я добавляю данные в состояние для каждого фаворита.Я пытаюсь создать массив для хранения всех этих данных, а затем setState с результирующим массивом, но вызовы асинхронные, поэтому я думаю, что массив на момент setState пуст.

У меня есть две (разные) работы кода, ноЯ не знаю, как установить состояние на снимке

КОД 1:

db.ref(`/users/${auth.currentUser.uid}/favorites`)
  .once('value', favorites => {
  if( favorites.val() !== null ) {
    favorites.forEach(favorite => {
      db.ref(`/shops/${favorite.key}`)
      .once('value', shop => {
        if( shop.val() !== null ) {
          objState = {
            name: shop.val().name,
            phone: shop.val().phone,
            postcode: shop.val().postcode,
            location: shop.val().location,
            status: favorite.val()
          };
        }
      }).then (function(){
        this.setState({
          shops: [...this.state.shops, objState]
        })
      })
    })
  })

Если я храню данные foreach в массиве и setState с массивом, не показывать мне ничего, потому что я думаю,Это асинхронный вызов, поэтому при попытке назначить массив в этот момент действительно пусто.

CODE 2:

async getShop(shopid, status) {
  var shop = await db.ref(`/shops/${shopid}`).once('value')
  return shop
}

async getFavorites() {
  var favorites = await db.ref(`/users/${auth.currentUser.uid}/favorites`).once('value')
  if( favorites.val() !== null ) {
    var shop;
    favorites.forEach(favorite => {
      shop = this.getShop(favorite.key, favorite.val())
      [ HERE ITS A GOOD PLACE TO ADD TO STATE THE SHOP INFO OR PERHAPS HAVE A Object AND ADD EVERY SHOP INSIDE AND THE ASSIGN TO THE STATE ?? ]
    })
  }
} catch(error) {
    // If any of the awaited promises was rejected, this catch block
    // would catch the rejection reason
    return null;
}

Большое спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...