我尝试在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。我希望我的问题很清楚,任何人都可以帮助我找到我的错误。
答案 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);