Где зацепиться промисом? 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
167 +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 Апр в 13:17
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 622 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир