Неопределенное значение при вызове функции в Firestore - PullRequest
0 голосов
/ 29 мая 2020

Я использую Firestore и написал следующий код:

export function getAllServices(uid) {
  let services = [];
  firestore.collection('users').doc(uid).collection('services').get().then(snapshot => {
    snapshot.docs.forEach(doc => {
      services.push(doc.data());
      console.log(services);
      return services;
    })
  })
}

Функция работает b / c console.log возвращает нужный мне массив. Однако, когда я называю это так

const uid = 'SgUaycgJqzLbdcrOhjQtgcDzddL2';
  const services = getAllServices(uid);
  console.log(services);

, журнал консоли всегда возвращается как undefined. Есть идеи?

1 Ответ

0 голосов
/ 29 мая 2020

Похоже, вы уже знаете причину проблемы, учитывая, что вы пометили свой вопрос с помощью 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 сахар, и что данные по-прежнему извлекаются асинхронно за кулисами.

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