Вы правильно указали, что эта проблема связана с обработкой обещаний.Вы возвращаете массив событий до того, как он сможет заполниться, потому что обещание еще не выполнено.
Если ваша среда это позволяет, я бы порекомендовал вам использовать 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);
});
});
};