Как мне перебрать результаты получения firebase - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь всех пользователей из документа Firebase.Я подозреваю, что моя проблема является ограничением моего понимания с javascript, хотя.

Я пробовал это с и без шаблона асинхронизации / отправки без удачи

const getUsers = () => {
    database.collection('users').onSnapshot(docs => {
      const users = [];
      docs.forEach(doc => {
        users.push({
          ...doc.data(),
          id: doc.id,
          ref: doc.ref,
        });
      });
      return users;
    });
  };

let users = getUsers();
  users &&
    users.map(user => {
      console.log('name: ', user.displayName);
    });

В конечном счете,Я бы хотел просмотреть каждого пользователя

Ответы [ 2 ]

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

Как объясняет @GazihanAlankus, поскольку запрос к базе данных Firestore является асинхронной операцией, вам необходимо вернуть Promise в вашей функции с помощью метода get() следующим образом:

  const getUsers = () => {
    return   //Note the return here
      database
      .collection('users')
      .get()
      .then(querySnapshot => {
        const users = [];
        querySnapshot.forEach(doc => {
          users.push({
            ...doc.data(),
            id: doc.id,
            ref: doc.ref
          });
        });
        return users;
      });
  };

Тогда вам нужно назвать его следующим образом:

  getUsers().then(usersArray => {
    console.log(usersArray);
    usersArray.map(user => {
      console.log('name: ', user.displayName);
    });
  });

поскольку функция возвращает Promise, см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then.


Вы можете выполнить следующий тест и посмотреть, в каком порядке выполняются console.log() s и что печатает второй console.log() в консоли:

  getUsers().then(usersArray => {
    console.log(usersArray);
    usersArray.map(user => {
      console.log('name: ', user.name);
    });
  });

  console.log(getUsers()); 
0 голосов
/ 04 мая 2019

У вас не может быть не асинхронной функции, которая получает пользователей из Firebase. Вы пытаетесь сделать невозможное возможным.

Вот что не так с вашим кодом: return users; возвращается из замыкания, которое вы даете onSnapshot. Он не возвращается с getUsers. В getUsers нет return, поэтому на самом деле возвращается undefined.

Закрытие, которое вы даете onSnapshot, действует в будущем, но getUsers должно вернуться в прошлое. Невозможно передать эти данные в прошлом, когда у вас их нет. Вы должны вернуть обещание и разобраться с ним в коде вызова. Вы не можете написать getUsers, который немедленно возвращает пользователей сразу.

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