Firebase Admin Node.js脚本异步执行顺序不符合预期问题求助
问题原因
你当前的写法用了Promise.all()搭配Array.map()遍历用户列表,这种写法会并发执行所有用户的处理逻辑:
- 所有用户的处理函数会同步启动,首先执行到
console.log(user.uid)输出用户ID - 碰到
await firestore.collection(...).get()这行时,async函数会立即返回一个pending状态的Promise,交出执行权,所以所有用户的ID会先全部打印完成 - 等各个Firestore请求陆续返回后,才会执行后续的
console.log(marketsQuerySnapshot.size)等逻辑,这就是你看到输出顺序不符合预期的原因
修复方案
要实现按顺序逐个处理用户,把并发的Promise.all + map换成串行的for...of循环即可,修改后的代码如下:
// omitting imports const firestore = admin.firestore(); const main = async () => { const listUsersResult = await admin.auth().listUsers(10); // 用for...of串行处理每个用户 for (const user of listUsersResult.users) { console.log(user.uid); try { const marketsQuerySnapshot = await firestore.collection(`users/${user.uid}/markets`).get(); console.log(marketsQuerySnapshot.size); // 如果不需要并行处理markets文档也可以换成for...of for (const result of marketsQuerySnapshot.docs) { console.log(result.data()); } } catch (e) { console.error(e); } } }; main();
补充说明
如果你的markets文档处理逻辑允许并行执行,也可以保留原来的Promise.all写法,不影响用户维度的串行处理逻辑。
内容的提问来源于stack exchange,提问作者Davide C
相关产品推荐
相关产品推荐

