【发布时间】:2020-01-18 19:54:55
【问题描述】:
我想将与我生成的数字相同的用户推送到我的数组中。循环完成后,我需要获取循环的结果,例如数组长度和数组中的项目,并对数组中的用户执行各种操作,例如记入他们的帐户。
我相当确定最好的方法是使用 Promises.all 来返回我给定的数组。但是,在尝试实现这一点时,我遇到了各种问题,并且很难弄清楚如何实现这一点。文档中似乎没有关于如何解决这个问题的好的文档,所以我正在浏览我在这个网站上找到的代码 sn-ps 来帮助我理解如何解决这个问题。
Multiple Firestore queries, single promise / callback
Waiting for a forEach to finish before return from my promise / function
一直是我的两个主要参考。
这是我在使用 Promise 时的尝试。并没有报错,但是当数组长度大于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,但这似乎又不起作用。那可能是因为我对异步函数的了解不正确。
【问题讨论】:
-
不幸的是,产品文档无法解决在处理 Promise 时可能出现的所有情况。我看到的是,当函数中的所有其他异步工作完成时,您永远不会返回一个解决方案。这是 Cloud Functions 唯一需要的。您可能需要参考这些视频教程以帮助更好地理解这一点。 firebase.google.com/docs/functions/video-series
-
感谢道格的回复!相信我,我不希望产品文档涵盖所有可能的情况。我看过你的视频,这是我首先了解 promise.all 的地方。我会再次查看它们,看看我是否能理解我在哪里犯了错误。
标签: typescript firebase promise google-cloud-firestore google-cloud-functions