Как превратить запрос Firestore в массив Javascript - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь экспортировать функцию firestore, которая выполняет запрос и возвращает массив, содержащий объекты в этом запросе.Я пытаюсь получить данные из вложенной коллекции документа и получить массив объектов документа, возвращаемых для визуализации клиенту.

Я пробовал ниже, но это не работает (например, объект возвращается пустым).Я думаю, что это связано с неправильной обработкой обещаний, но я не мог понять это самостоятельно.Спасибо за вашу помощь.

export const getEvents = (id) => {
  let events = [];
  firestore.collection('users')
    .doc(id)
    .collection('events')
    .get()
    .then((snapshot) => {
      snapshot.forEach((doc) => events.push(doc));
    });
    return events;
 };

1 Ответ

0 голосов
/ 27 сентября 2018

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

Если ваша среда это позволяет, я бы порекомендовал вам использовать async / await, потому что он делаеткод намного проще для чтения и понимания, например:

export const getEvents = async (id) => {
    let events = [];
    const snapshot = await firestore.collection('users')
        .doc(id)
        .collection('events')
        .get()
    snapshot.forEach((doc) => events.push(doc));
    return events;
};

Но если вы не можете использовать async / await, вы можете сделать это с помощью обещаний.Но вам нужно разрешить обещание только после получения данных:

const getEvents = (id) => {
    return new Promise((resolve, reject) => {
        let events = [];
        const snapshot = firestore.collection('users')
            .doc(id)
            .collection('events')
            .get()
            .then((snapshot) => {
                snapshot.forEach((doc) => events.push(doc));
                resolve(events); // return the events only after they are fetched
            })
            .catch(error => {
                reject(error);
            });
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...