簡體   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