我正在尝试在渲染屏幕之前获取所有数据。
我有商店和用户。
用户可以将商店添加到收藏夹。一个用户可以在他的收藏夹中拥有多个商店。
第一步,我们将获得当前用户的所有收藏夹。 返回的数据是这样的
[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;
}
非常感谢