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

时间:2019-01-25 00:31:49

标签: javascript arrays firebase google-cloud-firestore

我试图从函数中拉出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值并在函数范围之外自由使用。

2 个答案:

答案 0 :(得分:1)

从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()返回承诺,并将该承诺返回给调用代码的事实。您甚至可以从允诺中返回值,然后“冒泡”给调用者:

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()块,因为我们需要等待记录该值,直到异步加载数据为止。

答案 1 :(得分:0)

如果您只想在函数外使用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
}