繁体   English   中英

如何遍历 Firebase Firestore 文档数组并将值推送到数组中

[英]How to loop through an array of Firebase Firestore documents and push values into array

我正在 node.JS 中编写 Firebase Cloud Function 从 Firebase Firestore 读取用户数据。 我无法将令牌值推送到令牌数组并返回 function 末尾的所有令牌。 我的代码如下:

 function getTokens(subscribers) { return new Promise(async function (resolve, reject) { const tokenArray = []; subscribers.forEach(async (subscriber) => { await firestore.collection('users').doc(subscriber).get().then((user) => { console.log("Getting user data for user: ", user); const tokens = user.data().tokens; if (tokens) { tokens.forEach((token) => { console.log("Adding token to token array"); // data is available here but does not push into tokenArray tokenArray.push(token); }); } }).catch((error) => { console.error(error); reject(error); }); }); console.log("Token Array -- Final: ", tokenArray); resolve(tokenArray); }); };

您不能在forEach循环中使用async-await 尝试映射一组承诺,然后使用Promise.all()如下所示:

function getTokens(subscribers) {
  return new Promise(async function (resolve, reject) {
    
    const subscribersDocs = await Promise.all(
      subscribers.map((subscriber) => {
        return firestore.collection("users").doc(subscriber).get();
      })
    );


    const tokenArray = subscribersDocs.reduce((acc, curr) => {
      const tokens = curr.data().tokens;
      if (tokens) {
        acc = acc.concat(tokens);
      }
      return acc;
    }, []);

    console.log("Token Array -- Final: ", tokenArray);
    resolve(tokenArray);
  });
}

还结帐: 使用 async/await 和 forEach 循环

OP代码可以更正并更简洁如下:

async function getTokens(subscribers) {
  const getUser = subscriber => firestore.collection('users').doc(subscriber).get();
  const promises = subscribers.map(getUser);
  const users = await Promise.all(promises);
  return users.map(user => user.data().tokens).flat()
}

一些注意事项:

  • 将 function 装饰为async ,因为它是
  • 不要使用Promise.new()创建任何额外的 promise ,Firestore 的get()返回 promise
  • 使用get在数组中收集承诺,并使用map Promise.all()运行它们
  • 映射结果用户的data.tokens会生成一个 arrays 数组。 把它压平,你就完成了。
  • 只抛出的catch ,就像没有捕获一样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM