Функции 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, чтобы вы могли получить доступ к документам на каждом отдельном снимке.