React Native-Firebase-两个相关的调用

时间:2018-09-21 08:35:29

标签: firebase react-native asynchronous

我正在尝试在渲染屏幕之前获取所有数据。

我有商店用户

用户可以将商店添加到收藏夹。一个用户可以在他的收藏夹中拥有多个商店。

第一步,我们将获得当前用户的所有收藏夹。 返回的数据是这样的

[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,请不要显示任何内容,因为我认为这是异步调用,因此在此刻尝试分配数组时,实际上是空的。

代码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;
}

非常感谢

0 个答案:

没有答案