[英]How to push the user object in the Array in 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);
});
}
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()
}
一些注意事項:
async
,因為它是Promise.new()
創建任何額外的 promise ,Firestore 的get()
返回 promiseget
在數組中收集承諾,並使用map
Promise.all()
運行它們data.tokens
會生成一個 arrays 數組。 把它壓平,你就完成了。catch
,就像沒有捕獲一樣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.