Firebase 函数 - 循环内出现意外的“await” - 无法读取未定义的 属性 'reduce'
Firebase Functions - Unexpected `await` inside a loop - Cannot read property 'reduce' of undefined
我正在使用 Firebase Functions 提取用户数据。因为 Firestore 查询的“IN”查询限制为 10,所以我必须 运行 循环中的异步标注。
我不能在循环中执行异步标注,所以我必须将标注同步推入数组,然后调用 await Promise.all()
到 运行 循环外的标注。
执行此操作时,我收到来自 Firestore 的错误
TypeError: Cannot read property 'reduce' of undefined
我可以看到结果值是一个 Promise。所以我一定是写错了 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 {};
};
感谢 Doug 的回答:
let allResults = await Promise.all(results);
allResults.forEach(function(querySnapshot) {
for (let i in querySnapshot.docs) {
users.push(querySnapshot.docs[i]);
}
});
allResults
将是一个 QuerySnapshot 对象数组。它不会有一个名为 docs
的 属性,因为它只是一个数组。由于它没有名为 docs
的 属性,因此 allResults.docs
将是未定义的,并且不会有名为 reduce
.
的方法
您将不得不以某种方式迭代或映射该 QuerySnapshot 对象数组,以便您可以访问每个单独快照上的文档。
我正在使用 Firebase Functions 提取用户数据。因为 Firestore 查询的“IN”查询限制为 10,所以我必须 运行 循环中的异步标注。
我不能在循环中执行异步标注,所以我必须将标注同步推入数组,然后调用 await Promise.all()
到 运行 循环外的标注。
执行此操作时,我收到来自 Firestore 的错误
TypeError: Cannot read property 'reduce' of undefined
我可以看到结果值是一个 Promise。所以我一定是写错了 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 {};
};
感谢 Doug 的回答:
let allResults = await Promise.all(results);
allResults.forEach(function(querySnapshot) {
for (let i in querySnapshot.docs) {
users.push(querySnapshot.docs[i]);
}
});
allResults
将是一个 QuerySnapshot 对象数组。它不会有一个名为 docs
的 属性,因为它只是一个数组。由于它没有名为 docs
的 属性,因此 allResults.docs
将是未定义的,并且不会有名为 reduce
.
您将不得不以某种方式迭代或映射该 QuerySnapshot 对象数组,以便您可以访问每个单独快照上的文档。