Похоже, вы уже знаете причину проблемы, учитывая, что вы пометили свой вопрос с помощью asynchronous
. Данные загружаются из Firestore асинхронно, и ваш return services;
никоим образом не возвращает значение из getAllServices
. Единственный способ вернуть что-то getAllServices
- это первый уровень кода, но в этот момент ваш обратный вызов then()
еще не был вызван.
Решение состоит в том, чтобы увеличить значение изнутри обратного вызова then()
и вернуть его как обещание.
export function getAllServices(uid) {
return firestore.collection('users').doc(uid).collection('services').get().then(snapshot => {
let services = [];
snapshot.docs.forEach(doc => {
services.push(doc.data());
})
return services;
})
}
Затем вы можете вызвать getAllServices
и использовать результат следующим образом:
const uid = 'SgUaycgJqzLbdcrOhjQtgcDzddL2';
getAllServices(uid).then(function(services) {
console.log(services);
});
Вы можете сделать приведенное выше немного более знакомым, используя современные JavaScript ключевые слова async
и await
export async function getAllServices(uid) {
let services = [];
return firestore.collection('users').doc(uid).collection('services').get().then(snapshot => {
let services = [];
snapshot.docs.forEach(doc => {
services.push(doc.data());
})
return services;
})
}
const uid = 'SgUaycgJqzLbdcrOhjQtgcDzddL2';
let services = await getAllServices(uid);
console.log(services);
Просто имейте в виду, что это весь (прекрасно читаемый) синтаксис c сахар, и что данные по-прежнему извлекаются асинхронно за кулисами.