我想从cloud firestore
中获取50个用户,两种方法都有。但实际上我不知道哪一个是表演性的,因为我们国家的互联网连接很差,if our focus be only fetching not iterating
。
-
第一种方式(单个请求(
let tempList = []; const matchingUsers = [user1, user2, user3, ..., user50]; const snap = await db.collection('users').get(); if (snap.size > 0) { sanp.docs.forEach(doc => { const data = doc.data(); matchingUsers.forEach(user => { if (data.user === user) { tempList.push(data.user); } }); }); }
-
第二种方式(多次请求(
matchingUsers.forEach(async user => { const snap = await db.collection('users').doc(user).get(); tempList.push(snap.data().user) });
使用第一种方法,您实际上是在获取整个用户集合,并将所有相应的数据从后端(Firestore(传输到前端。这真的没有效率,尤其是如果你想过滤掉50万个用户的话!另外请注意,您将为50万次阅读付费,而不是50次(请参阅定价(。
因此,只获取您想要的文档(即正好为50个用户(是最有效的方法。由于get()
方法是异步的并返回Promise,因此可以按如下方式使用Promise.all()
:
const matchingUsers = [user1, user2, user3, ..., user50];
const promises = matchingUsers.map(u => db.collection('users').doc(u).get());
Promise.all(promises).then(results => {
//results is an array of DocumentSnapshots
//use any array method, like map or forEach
results.map(docSnapshot => {
console.log(docSnapshot.data());
});
});
正如文档中所解释的,Promise.all()
的优点是"它返回一个单个Promise,当作为可迭代对象传递的所有Promise都已实现时,该Promise就会实现",这使得管理不同的异步并行调用变得非常容易。