繁体   English   中英

我正在尝试从函数中提取我的doc.data数组并在范围外使用它

[英]I am trying to pull my doc.data Array from within a function and use it outside the scope

我试图从函数中拉出我的docData数组,由于某种原因,我无法从函数中拉出变量并在范围之外使用它,我希望能够从数组中拉出并使用它。范围

          function showData() {
            var jobRef = dataFirebase.collection("Jobs").where("Industry" , "==" , "Medical");


            jobRef.get().then(function(querySnapshot) {

              let allDocData = [];
              querySnapshot.forEach(function(doc) {
                  allDocData.push(doc.data());
              });

              return allDocData;

            });
          }

          var dataValues = showData()


          console.log(dataValues);

我希望提取allDocData值并在函数范围之外自由使用。

数据是从Firestore异步加载的,以防止阻止浏览器。 加载数据时,其余代码继续进行。 然后,在加载数据时,将调用then()块/回调。

通过在代码中放置一些日志语句,最容易理解这意味着什么:

var jobQuery = dataFirebase.collection("Jobs").where("Industry" , "==" , "Medical");

console.log("Before starting to load");
jobQuery.get().then(function(querySnapshot) {
    console.log("Got data");
});
console.log("After starting to load");

运行此代码时,输​​出为:

开始加载之前

开始加载后

得到数据

这可能不是您期望的顺序,如果您阅读上面的说明,这是有道理的。 但这也意味着您拥有的return语句不会执行任何操作。 实际上,该功能在加载数据时已经很长时间了。

因此,任何需要数据的代码都必须在then()回调内部或从那里进行调用。


因此,最简单的示例是将数据记录移至回调中:

  function showData() {
    var jobQuery = dataFirebase.collection("Jobs").where("Industry" , "==" , "Medical");

    jobQuery.get().then(function(querySnapshot) {

      let allDocData = [];
      querySnapshot.forEach(function(doc) {
          allDocData.push(doc.data());
      });

      console.log(dataValues);

    });
  }

  showData()

这可行,但是限制了showData()方法的可重用性。


更具可重用性和现代性的选项是利用get()返回promise并将该promise返回给调用代码的事实。 您甚至可以从Promise中返回值,然后“冒泡”给调用者:

function showData() {
  var jobRef = dataFirebase.collection("Jobs").where("Industry" , "==" , "Medical");


  return jobRef.get().then(function(querySnapshot) {

    let allDocData = [];
    querySnapshot.forEach(function(doc) {
        allDocData.push(doc.data());
    });

    return allDocData;

  });
}

showData().then(function(dataValues) {
    console.log(dataValues);
});

您会注意到,调用代码中现在还有一个then()块,因为我们需要等待记录该值,直到数据被异步加载为止。

如果只想在函数外使用allDocData

var docData;

function showData() {
    var jobRef = dataFirebase.collection("Jobs").where("Industry" , "==" , "Medical");


    jobRef.get().then(function(querySnapshot) {

    let allDocData = [];
    querySnapshot.forEach(function(doc) {
        allDocData.push(doc.data());
    });
    docData = allDocData;
    //Rest of code
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM