云功能和firestore将数据保存到数组中

时间:2018-02-19 22:59:15

标签: javascript google-cloud-firestore

我尝试在google app上的云端firestore中获取数据。我想搜索一个对象,然后想要将图像的链接提取到一个数组中。如果找到更多对象,则应在数组中全部推送链接。

这就是我所拥有的:

let array = []; //Everything should be in here

var collectionRef = db.collection('shoes');
var query = collectionRef.where('sport', '==', 'tennis');

query.get().then(function(results) {
    if(results.empty) {
      console.log("No documents found!");   
    } else {
      // go through all results
      results.forEach(function (doc) {
        array.push(document.data().name);
      });
    }
  }).catch(function(error) {
      console.log("Error getting documents:", error);
  });



var prodpic = array[0]; // Array is not filled because in output always "undefined"

我确实想在后来的程序中使用prodpic中的img-links。我希望我的问题很清楚,任何人都可以帮助我找到我的错误。

1 个答案:

答案 0 :(得分:0)

数据是从Cloud Firestore异步加载的。这意味着,当您分配var prodpic = array[0]时,它尚未加载。

通过使用一些日志语句替换大多数代码,这是最容易看到的:

console.log("Before starting query");
query.get().then(function(results) {
  console.log("In query results");
})
console.log("After starting query");

运行此代码时输出为:

  

开始查询之前

     

开始查询后

     

在查询结果中

这可能不是您所期望的,但完全解释了为什么var prodpic = array[0]无法正常工作:数据尚未加载,因此array[0]为空

要处理异步加载,您必须确保需要数据的代码内部 then()回调。所以:

query.get().then(function(results) {
  if(results.empty) {
    console.log("No documents found!");   
  } else {
    // go through all results
    results.forEach(function (doc) {
      array.push(document.data().name);
    });
    var prodpic = array[0]; 
  }
}).catch(function(error) {
  console.log("Error getting documents:", error);
});

有关此内容的更多信息,请阅读Doug的博客文章:https://medium.com/google-developers/why-are-firebase-apis-asynchronous-callbacks-promises-tasks-e037a6654a93

一个额外的优化:如果您只关心第一个匹配的文档,那么使用limit查询会更有效:

var query = collectionRef.where('sport', '==', 'tennis').limit(1);