Вложенная функция Promise с использованием базы данных Firebase - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующая функция, которая принимает аргумент (массив «имен»), а затем проверяет данные из моей базы данных Firebase для каждого пользователя по этому массиву.

Используется для компиляции массива «настроек» для каждого пользователя с его электронной почтой и именами, которые пользователь предоставил в список в качестве аргумента.Функция выглядит следующим образом.

fbDaemon = ({ folderNames }) => {
  const settings = [];
  ref.once("value")
    .then((snapshot) => {
      snapshot.forEach(user => {
        auth.getUser(user.key)
          .then(function(userRecord) {
            let email = userRecord.toJSON().email;
            let zips = [];

            user.forEach(setting => {
              let dep = setting.val().department;
              if(folderNames.includes(dep)){
                zips.push(dep);
              }
            });

            settings.push({ email, zips });
          })
          .catch(function(error) {
            console.log("Error fetching user data:", error);
          });
      });
  });
});

По сути, она просматривает всю мою базу данных и составляет список настроек, которые я передам следующей функции.Конечный результат должен выглядеть примерно так:

[ { email: 'example@example1.com',
    zips: [ 'Drug Enforcement Administration', 'Executive Branch' ] }, 
 { email: 'example@example2.com',
    zips: [ 'FEMA', 'Congress' ] },
];

Проблема, с которой я столкнулся сейчас, заключается в том, что я не могу вернуть массив «settings» в нужное время.

Как я могу перенастроить эту функцию так, чтобы массив настроек возвращался только после полного запуска функции?

Другими словами, я хотел бы вернутьразрешено обещание с массивом настроек.Как я могу это сделать?

1 Ответ

0 голосов
/ 25 октября 2018

Возможно, вы могли бы использовать Promise.all() здесь, чтобы разрешить массив обещаний (где каждый элемент в массиве соответствует вызову getUser для этого элемента / пользователя)?

Итак, что-тоэти строки:

fbDaemon = ({ folderNames, folderPaths }) => {
  const settings = [];

  return ref.once("value")
    .then((snapshot) => {

      // Collect all users from snapshot into an array
      const users = []
      snapshot.forEach(user => { users.push(user) })

      // Create promise for each user, and use Promise.all to 
      // resolve when each "user promise" is complete
      return Promise.all(users.map(user => {

        // Be sure to add "return" here
        return auth.getUser(user.key)
        .then(function(userRecord) {
          let email = userRecord.toJSON().email;
          let zips = [];

          user.forEach(setting => {
            let dep = setting.val().department;
            if(folderNames.includes(dep)){
              zips.push(dep);
            }
          });

          settings.push({ email, zips });
        })
        .catch(function(error) {
          console.log("Error fetching user data:", error);
        })
      }));
  }).then(function() {

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