javascript中两个函数之间的作用域问题
我尝试使用xlsx填充获取excel工作表,因此我尝试从mailEvents集合获取值,以便可以在init Collection函数中添加或传递值。如果我已解决此问题,则有关excel的问题也会得到解决。 在这个问题中,我想访问init集合中的topHeader变量。 在arr2中,有以下形式的值javascript中两个函数之间的作用域问题,javascript,arrays,google-cloud-firestore,xlsx-populate,Javascript,Arrays,Google Cloud Firestore,Xlsx Populate,我尝试使用xlsx填充获取excel工作表,因此我尝试从mailEvents集合获取值,以便可以在init Collection函数中添加或传递值。如果我已解决此问题,则有关excel的问题也会得到解决。 在这个问题中,我想访问init集合中的topHeader变量。 在arr2中,有以下形式的值[“打开”、“处理”] const completeReport = (startTime,endTime) => { serverRef = db.collection("MailEve
[“打开”、“处理”]
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)
}
});
}
由于let具有块作用域,因此无法在外部访问 建议您使用
var
声明一个变量,然后分配它
希望这有帮助
const completeReport = () => {
let serverRef = db.collection("MailEvents");
var topHeader;
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);
topHeader = [...new Set(arr1.concat(arr2))]; //assign value
}
});
serverRef = 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)
}
});
}
const completeReport=()=>{
让serverRef=db.collection(“MailEvents”);
var topHeader;
让getDocs=serverRef
.其中(“时间戳”,“>=”,开始时间)
.where(“timestamp”,“数据从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)
}
});
}
});
}
这里最大的变化是:
completeReport
函数上的async
标记,因为调用方需要知道此函数现在可能返回承诺/显示异步行为
- 两个
get()
调用中的wait
关键字意味着不再需要then
块
- 缩进减少,特别是与我答案中的第一个片段相比
当使用这种方法时,需要始终意识到的一点是调用仍然是异步的。虽然使用async
/wait
使代码更易于阅读,但它不会改变API的实际行为。让它有一个块范围。定义一个全局变量而不是完全全局的,但移动let
声明位于serverRef=db.collection(“MailEvents”)前面的第二行
行。把作业留在原处。@JeremyJStarcher你能解释一下吗你需要让在serverRef
前面打印出来undefined@Amar-我的代码中有一个输入错误-将var topheader更改为topheader。请交叉check@MonicaAcha我已经尝试了我的主代码,但它不工作它打印efined@Amar您可以发布控制台上显示的错误日志吗
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)
}
});
}
});
}
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)
}
}
}