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