Где зацепиться промисом? getChatByUid(uid) {
//ref на все комнаты/чаты пользователя
const userRoomsRef = db.ref('users').child(this.auth.uid).child('rooms');
let roomExists = false;
//получаем все комнаты и итерируем "room in rooms"
userRoomsRef.once('value', rooms => rooms.forEach(room => {
//получаем всех пользователей в комнате
this.getRoomUsers(room.key).then(users => {
//итерируем
for (var user in users) {
// если находим пользователя в текущей комнате значит новую создавать не надо
if (users.hasOwnProperty(user) && user === uid) {
//просто переключаемся на текущую комнату и пишем в переменную что комната существует
this.currentRoom = room.key;
roomExists = true;
}
}
})
})
//тут главная проблема, этот код выполнится раньше предыдущего блока
// и будет всегда создавать новую комнату
if ( !roomExists ) { this.createRoom(uid) };
//Двигать этот блок вверх тоже не получается он всеравно выполняется до всех итераций.
);
}
Посоветуйте пожалуйста, что тут можно сделать, что-то голову всю сломал.

21 Авг 2019 в 06:29
198 +1
0
Ответы
1

Проблема здесь заключается в том, что код вне блока once('value', rooms => {...}) будет выполнен до завершения всех итераций по комнатам. Для решения этой проблемы можно воспользоваться промисами и асинхронным программированием.

Вы можете преобразовать функцию getChatByUid в асинхронную и использовать async/await для работы с промисами. Вот пример кода, который показывает, как можно это сделать:

async getChatByUid(uid) {
const userRoomsRef = db.ref('users').child(this.auth.uid).child('rooms');
let roomExists = false;
const roomsSnapshot = await userRoomsRef.once('value'); // ждем завершения запроса
roomsSnapshot.forEach(async room => {
const users = await this.getRoomUsers(room.key); // ждем завершения запроса
for (var user in users) {
if (users.hasOwnProperty(user) && user === uid) {
this.currentRoom = room.key;
roomExists = true;
}
}
});
if (!roomExists) {
this.createRoom(uid); // если комната не существует, создаем новую
}
}

Таким образом, используя асинхронные функции и await, вы можете управлять порядком выполнения кода и осуществлять действия только после завершения асинхронных операций.

20 Апр 2024 в 13:17
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир