Я пытаюсь получить все данные перед рендерингом экрана.
У меня есть Магазины и Пользователи .
Пользователи могут добавить в избранное магазин.Один пользователь может иметь более одного магазина в своих избранных.
Первый шаг - получение всех избранных текущего пользователя.Возвращаемые данные выглядят примерно так:
[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;
}
Большое спасибо,