Для l oop с вложенными запросами Firebase Javascript - PullRequest
0 голосов
/ 26 мая 2020

У меня есть узел со списком пользователей и второй узел с рейтинговой информацией для каждого пользователя. Я хотел бы l oop среди пользователей первого узла и для каждого получить рейтинг от второго узла. Проблема в том, что l oop не ждет ответа от второго узла, поэтому возвращаемый массив всегда пуст. Я знаю, что мне нужно использовать метод await / asyn c, но он не работает. Спасибо за помощь

return admin.database().ref('/user').once('value').then(async(snap) => {
for(const userId of snap) {
    admin.database().ref('/rating/' + userId.key).once('value').then(await (snap) =>{
        var rating = snap.val();
        array.push([userId.key, rating]);
    }).catch(error => {
        console.log("failed 1 " + error.code);
    });
}
return array;
}).catch(error => {
console.log("failed 2 " + error.code);
});

1 Ответ

1 голос
/ 26 мая 2020

Вам необходимо использовать Promise.all(), как показано ниже (непроверено):

  const array = [];
  const userIds = [];
  return admin
    .database()
    .ref('/user')
    .once('value')
    .then((snap1) => {
      const promises = [];
      snap1.forEach((childSnapshot1) => {
        promises.push(
          admin
            .database()
            .ref('/rating/' + childSnapshot1.key)
            .once('value')
        );
        userIds.push(childSnapshot1.key);
      });
      return Promise.all(promises);
    })
    .then((snap2) => {
      snap2.forEach((childSnapshot2, idx) => {
        const rating = childSnapshot2.val();
        array.push([userIds[idx], rating]);
      });
      return array;
    })
    .catch((error) => {
      //...
    });

Как объяснено в Promise.all() do c, "возвращаемые значения будет в порядке выполнения обещаний, независимо от порядка выполнения ". Таким образом, для массивов userIds и snap2 порядок их элементов соответствует: поэтому вы можете сделать array.push([userIds[idx], rating]);

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