Где зацепиться промисом? 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) }; //Двигать этот блок вверх тоже не получается он всеравно выполняется до всех итераций. ); } Посоветуйте пожалуйста, что тут можно сделать, что-то голову всю сломал.
Проблема здесь заключается в том, что код вне блока 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, вы можете управлять порядком выполнения кода и осуществлять действия только после завершения асинхронных операций.
Проблема здесь заключается в том, что код вне блока 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, вы можете управлять порядком выполнения кода и осуществлять действия только после завершения асинхронных операций.