You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:45:03