我已经尝试使用xlsx-populate获取excel工作表,所以我试图从mailEvents集合获取值,以便我可以在init集合函数中添加或传递值。如果我解决了这个问题,那么关于excel的问题也是解决了。在此问题中,我想访问init集合中的topHeader var。在arr2中,有这种形式的值['open','processed']
const completeReport = (startTime,endTime) => {
serverRef = db.collection("MailEvents");
let getDocs = serverRef
.where("timestamp", ">=", startTime)
.where("timestamp", "<=", endTime)
.get()
.then(querySnapshot => {
if (querySnapshot) {
let docs = querySnapshot.docs.map(doc => doc.data());
let arr1 = ["email", "reportName", "office"];
let arr2 = docs.map(a => a.event);
let topHeader = [...new Set(arr1.concat(arr2))];
}
});
let query = db.collection("inits");
let queryData = query
.where("report", "in", ["payroll", "footprints"])
.get()
.then(querySnapshot => {
if (querySnapshot) {
let docs = querySnapshot.docs.map(doc => doc.data());
console.log(topHeader)
}
});
}
所以我想要这种形式的输出
["email", "reportName", "office",'open','processed']
从Firebase异步加载数据,因为它可能需要一些时间才能返回。您的主代码无需等待数据返回,而是继续直接执行。然后,当数据可用时,将then()
使用该数据调用回调。
这意味着任何需要访问Firestore中的数据的代码都必须在then()
回调内部,或从那里调用。
例如:
const completeReport = (startTime,endTime) => {
serverRef = db.collection("MailEvents");
let getDocs = serverRef
.where("timestamp", ">=", startTime)
.where("timestamp", "<=", endTime)
.get()
.then(querySnapshot => {
if (querySnapshot) {
let docs = querySnapshot.docs.map(doc => doc.data());
let arr1 = ["email", "reportName", "office"];
let arr2 = docs.map(a => a.event);
let topHeader = [...new Set(arr1.concat(arr2))];
let query = db.collection("inits");
let queryData = serverRef
.where("report", "in", ["payroll", "footprints"])
.get()
.then(querySnapshot => {
if (querySnapshot) {
let docs = querySnapshot.docs.map(doc => doc.data());
console.log(topHeader)
}
});
}
});
}
有一些替代方法,尤其是当您愿意使用更现代的JavaScript构造时。最简单的方法是使用async
/await
关键字,该关键字将上面的内容包装在一些漂亮的语法糖中,对于大多数开发人员而言,该语法更常见。
上面的代码在您应用async
/时将变为await
:
const completeReport = async (startTime,endTime) => {
serverRef = db.collection("MailEvents");
let querySnapshot = await serverRef
.where("timestamp", ">=", startTime)
.where("timestamp", "<=", endTime)
.get();
if (querySnapshot) {
let docs = querySnapshot.docs.map(doc => doc.data());
let arr1 = ["email", "reportName", "office"];
let arr2 = docs.map(a => a.event);
let topHeader = [...new Set(arr1.concat(arr2))];
let query = db.collection("inits");
querySnapshot = await serverRef
.where("report", "in", ["payroll", "footprints"])
.get();
if (querySnapshot) {
let docs = querySnapshot.docs.map(doc => doc.data());
console.log(topHeader)
}
}
}
这里最大的变化是:
async
上的标记completeReport
,因为调用者需要意识到该函数现在可能返回一个Promise / Exhibit异步行为。await
两个get()
通话中的关键字,这意味着您不再需要then
屏蔽。使用此方法时始终要意识到的一件事是调用仍然是异步的。使用async
/await
使代码更易于阅读,但不会更改API的实际行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句