在 ForEach 循环 Firebase Firestore 之后使用承诺数组



我想将用户推送到我的数组中,这些数组的数字与我生成的数组相同。循环完成后,我需要获取循环的结果,例如数组长度和数组中的项目,并对数组中的用户执行各种操作,例如记入他们的帐户。

我相当确定最好的方法是使用promises,使用Promises.all返回我给定的数组。然而,在尝试实现这一点时,我遇到了各种问题,并且很难弄清楚如何实现这一点。文档中似乎没有关于如何解决这个问题的良好文档,所以我正在浏览我在这个网站上找到的代码片段,以帮助我了解如何解决这个问题。

多个 Firestore 查询,单个承诺/回调

等待一个 foreach 完成,然后再从我的承诺/功能返回

一直是我的两个主要参考。

这是我使用承诺时的尝试。它没有出错,但当数组的长度大于 1 时,它似乎没有意识到数组的长度大于 1。

export const prize1 = functions.pubsub.schedule('every 2 minutes').onRun((context: any) => {
function getUsers() {
let ranNum2 = '';
for (let _i = 0; _i < 2; _i++)
ranNum2 += String(Math.floor(Math.random() * 9) + 0);
let winnersP2: string[] = [];
const usersRef = db.collection('users');
let dbPromises: string[] = [];
let _allUsers = usersRef.get().then((userSnapshot: any) => {
userSnapshot.forEach((userDoc: any) => {
userDoc.ref.collection('numbers').get().then((numSnapshot: any) => {
numSnapshot.forEach((numDoc: any) => {

let pp = Number(numDoc.data().numbers);
if (pp == Number(ranNum2))
winnersP2.push(userDoc.ref.id);
});
return Promise.all(dbPromises).then(results => {
if (dbPromises.length > 0)
console.log("GREATER THAN 0");
//do my stuff
if (results.length > 0)
console.log("GREATER THAN 0");
//do my stuff
})
});
});
})
.catch((error: any) => {
console.log("Error getting document: ", error);
});
}
return null;
});

这是我尝试修改的基本代码。

export const prize1 = functions.pubsub.schedule('every 2 minutes').onRun((context: any) => {
let ranNum2 = '';
for (let _i = 0; _i < 2; _i++)
ranNum2 += String(Math.floor(Math.random() * 9) + 0);
let winnersP2: string[] = [];
const usersRef = db.collection('users');
let _allUsers = usersRef.get().then((userSnapshot: any) => {
userSnapshot.forEach((userDoc: any) => {
userDoc.ref.collection('numbers').get().then((numSnapshot: any) => {
numSnapshot.forEach((numDoc: any) => {
let pp = Number(numDoc.data().numbers);
if (pp == Number(ranNum2))
winnersP2.push(userDoc.ref.id);
});
if (winnersP2.length > 0)
//do my stuff
});
});
});
})
.catch((error: any) => {
console.log("Error getting document: ", error);
});
return null;
});

我还尝试使用 setTimeOut 等到 for 循环完成后,而不是查看数组是否大于 0,但这似乎又不起作用。这可能是因为我对异步函数的了解不正确。

有了承诺,保持thencatch块对齐很重要。创建嵌套块可能会导致混淆。您还需要确保从每个块返回一个结果,该结果将在后续块中处理。

您正在尝试基本上从每个用户记录的numbers文档中读取,并处理生成的数字列表。这看起来像下面这样:

userCollection.get().then((docs) => {
return Promise.all(docs.map((docRef) => {
return docRef.collection('numbers').get();
});
}).then((numbersDocs) => {
// do something with the list of docs
});

最新更新