Как использовать для внутри цикла и запроса данных из Firebase - PullRequest
1 голос
/ 31 мая 2019

У меня есть запрос, который получает все ключи пользователей в моей базе данных Firebase. Эти ключи сохранены в массив. Затем я хотел бы перебрать массив и запрос внутри цикла для имени пользователя. Проблема в том, что он останавливается при загрузке первого имени - цикл не выполняет запрос, даже если в массиве 1000 ключей?

var i;

for (i = 0; i < emailArray.length; i++) { 
    userIDgotten = emailArray[i];

    console.log(userIDgotten);

    return firebase.database().ref('/users/' + userIDgotten).once('value').then(function(snapshotUser) {
        const name = snapshotUser.val().name;

        console.log("NAME: " + name);

        allTicketEmailsFromUsers = allTicketEmailsFromUsers + ", " + name;

        console.log(allTicketEmailsFromUsers);
    });
}

Я не получаю ошибок, но цикл просто останавливается после получения первого имени.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Метод Once () является асинхронным и возвращает Обещание.

Поскольку вы хотите выполнить несколько запросов с once() параллельно , вам необходимо использовать Promise.all () следующим образом:

var promises = [];
for (var i = 0; i < emailArray.length; i++) { 
   userIDgotten = emailArray[i];

   console.log(userIDgotten);

   promises.push(firebase.database().ref('/users/' + userIDgotten).once('value'));

}

Promise.all(promises)
.then(function(results) {
    var allTicketEmailsFromUsers = "";
    results.forEach(function(snapshotUser) {
        const name = snapshotUser.val().name;
        console.log("NAME: " + name);
        allTicketEmailsFromUsers = allTicketEmailsFromUsers + ", " + name;
    });
    console.log(allTicketEmailsFromUsers);
}
1 голос
/ 31 мая 2019

Вы используете return в вашем цикле, который останавливает цикл.
Если вы удалите это возвращение, оно должно работать так, как вы ожидаете.

for (var i = 0; i < emailArray.length; i++) { 
    userIDgotten = emailArray[i];

    console.log(userIDgotten);

    firebase.database().ref('/users/' + userIDgotten).once('value').then(function(snapshotUser) {
        const name = snapshotUser.val().name;

        console.log("NAME: " + name);

        allTicketEmailsFromUsers = allTicketEmailsFromUsers + ", " + name;

        console.log(allTicketEmailsFromUsers);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...