javascript中两个函数之间的作用域问题

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

我尝试使用xlsx填充获取excel工作表,因此我尝试从mailEvents集合获取值,以便可以在init Collection函数中添加或传递值。如果我已解决此问题,则有关excel的问题也会得到解决。 在这个问题中,我想访问init集合中的topHeader变量。 在arr2中,有以下形式的值
[“打开”、“处理”]

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)
      }
    }
}