Функции Firebase - Неожиданное ожидание внутри al oop - Невозможно прочитать свойство reduce of undefined - PullRequest
0 голосов
/ 04 августа 2020

Я использую функции Firebase для получения пользовательских данных. Поскольку для запросов Firestore существует ограничение на количество запросов «IN», равное 10, мне нужно выполнить выноску asyn c в al oop.

Я не могу выполнить выноску asyn c в al oop, поэтому мне нужно синхронно sh выноски поместить в массив, а затем вызвать await Promise.all(), чтобы запустить выноски за пределами l oop.

Когда я это сделаю, я получаю сообщение об ошибке из Firestore

TypeError: Невозможно прочитать свойство «уменьшить» из undefined

Я вижу, что результатом является обещание. Итак, я должен написать reduce или Promise.all() неправильно ...

Если я вижу, что значение является обещанием, почему обещание приходит как undefined?

const buildChatMatches = async ({id, matches, singles}) => {
  const existing = singles || {};
  if (Array.isArray(matches) && matches.length > 0) {
    let numberOfDozens = matches.length / 10;
    let results = [];
    let i = 0;
    while (i < Math.ceil(numberOfDozens)) {
      let sliceMatches = matches.slice(i * 10, (i + 1) * 10);
      const query = admin
        .firestore()
        .collection(USER_COLLECTION_NAME)
        .where("id", "in", sliceMatches);
      results.push(query.get());
      i++;
    }
    let allResults = await Promise.all(results);
    return allResults.docs.reduce((map, doc) => {
      map[doc.id] = pickUserInfo(doc.data(), existing[doc.id]);
      return map;
    });
  }
  return {};
};

благодаря ответу Дуга:

let allResults = await Promise.all(results);
allResults.forEach(function(querySnapshot) {
  for (let i in querySnapshot.docs) {
    users.push(querySnapshot.docs[i]);
  }
});

1 Ответ

2 голосов
/ 04 августа 2020

allResults будет массивом объектов QuerySnapshot. У него не будет свойства с именем docs, потому что это просто массив. Поскольку у него нет свойства с именем docs, allResults.docs будет неопределенным и не будет иметь метода с именем reduce.

Вам нужно будет каким-то образом выполнить итерацию или сопоставить этот массив объектов QuerySnapshot так что вы можете получить доступ к документации по каждому отдельному снимку.

...