javascript中两个函数之间的范围问题

阿玛

我已经尝试使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JavaScript中两个Promise函数之间的区别

来自分类Dev

函数范围修改全局变量中两个变量赋值之间的差异

来自分类Dev

在javascript中显示两个日期范围之间的所有日期

来自分类Dev

如何管理python中两个范围之间的值?

来自分类Dev

在C ++中替换两个迭代器之间的范围

来自分类Dev

在MYSQL中获取两个日期范围之间的记录

来自分类Dev

Oracle:在两个日期之间的月份中创建范围

来自分类Dev

在两个Javascript / Jquery函数之间传递var?

来自分类Dev

在两个Javascript / Jquery函数之间传递var?

来自分类Dev

在页面加载时触发两个 javascript 函数的问题

来自分类Dev

创建一个函数来测试两个范围之间的值

来自分类Dev

如何在android中的范围搜索栏中设置两个拇指之间的范围?

来自分类Dev

列表中两个数字之间的JavaScript函数?

来自分类Dev

函数中的Javascript范围问题

来自分类Dev

JavaScript中两个画布坐标之间的距离

来自分类Dev

JavaScript中两个原型设置代码之间的区别

来自分类Dev

JavaScript 中两个日期之间的天数

来自分类Dev

两个函数之间的尾递归

来自分类Dev

在函数之间传递两个变量

来自分类Dev

两个函数之间的递归调用

来自分类Dev

两个预测函数之间的差异

来自分类Dev

结合两个PHP函数的问题

来自分类Dev

如何在JavaScript中结合两个不同的函数以显示零(0)和n之间的2的倍数?

来自分类Dev

javascript-在两个颜色范围之间多次更改文本颜色

来自分类Dev

这两个Clojure函数之间有什么区别和问题?

来自分类Dev

这两个Clojure函数之间有什么区别和问题?

来自分类Dev

如何在javascript中总结两个不同的函数

来自分类Dev

javascript中带两个括号的函数

来自分类Dev

javascript中两个函数的正确算术运算

Related 相关文章

  1. 1

    JavaScript中两个Promise函数之间的区别

  2. 2

    函数范围修改全局变量中两个变量赋值之间的差异

  3. 3

    在javascript中显示两个日期范围之间的所有日期

  4. 4

    如何管理python中两个范围之间的值?

  5. 5

    在C ++中替换两个迭代器之间的范围

  6. 6

    在MYSQL中获取两个日期范围之间的记录

  7. 7

    Oracle:在两个日期之间的月份中创建范围

  8. 8

    在两个Javascript / Jquery函数之间传递var?

  9. 9

    在两个Javascript / Jquery函数之间传递var?

  10. 10

    在页面加载时触发两个 javascript 函数的问题

  11. 11

    创建一个函数来测试两个范围之间的值

  12. 12

    如何在android中的范围搜索栏中设置两个拇指之间的范围?

  13. 13

    列表中两个数字之间的JavaScript函数?

  14. 14

    函数中的Javascript范围问题

  15. 15

    JavaScript中两个画布坐标之间的距离

  16. 16

    JavaScript中两个原型设置代码之间的区别

  17. 17

    JavaScript 中两个日期之间的天数

  18. 18

    两个函数之间的尾递归

  19. 19

    在函数之间传递两个变量

  20. 20

    两个函数之间的递归调用

  21. 21

    两个预测函数之间的差异

  22. 22

    结合两个PHP函数的问题

  23. 23

    如何在JavaScript中结合两个不同的函数以显示零(0)和n之间的2的倍数?

  24. 24

    javascript-在两个颜色范围之间多次更改文本颜色

  25. 25

    这两个Clojure函数之间有什么区别和问题?

  26. 26

    这两个Clojure函数之间有什么区别和问题?

  27. 27

    如何在javascript中总结两个不同的函数

  28. 28

    javascript中带两个括号的函数

  29. 29

    javascript中两个函数的正确算术运算

热门标签

归档