Функции Firebase - Неожиданное ожидание внутри цикла - Невозможно прочитать свойство reduce of undefined

Я использую функции Firebase для извлечения пользовательских данных. Поскольку для запросов Firestore существует ограничение на количество запросов "IN", равное 10, мне приходится выполнять асинхронный вызов в цикле.

Я не могу выполнить асинхронный вызов в цикле, поэтому мне приходится синхронно вставлять выноски в массив, а затем вызывать await Promise.all() для выполнения выноски вне цикла.

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

TypeError: невозможно прочитать свойство "уменьшить" неопределенного значения.

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

Решение

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

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

Другие вопросы по тегам