Javascript firebase查询后数组未保存值的问题
函数完成后,不会更新变量HardProblems。它正在循环中更新,但不保存。这是firebase呼叫。e、 g.HardProblems.length为0,但应为非零Javascript firebase查询后数组未保存值的问题,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,函数完成后,不会更新变量HardProblems。它正在循环中更新,但不保存。这是firebase呼叫。e、 g.HardProblems.length为0,但应为非零 function getHardProblems(){ var HardProblems = []; var foo = []; db.collection("hardproblems") .get() .then(function(querySnapshot) { querySnapshot.f
function getHardProblems(){
var HardProblems = [];
var foo = [];
db.collection("hardproblems")
.get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
// doc.data() is never undefined for query doc snapshots
//console.log(doc.id, " => ", doc.data());
HardProblems.push({docID: doc.id, ...doc.data()});
});
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
console.log("Got Hard Problems "+HardProblems.length)
}
如果要在异步代码之外记录硬问题,请将其移动到
then()
块:
function getHardProblems(){
var HardProblems = [];
var foo = [];
db.collection("hardproblems")
.get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
// doc.data() is never undefined for query doc snapshots
//console.log(doc.id, " => ", doc.data());
HardProblems.push({docID: doc.id, ...doc.data()});
});
console.log("Got Hard Problems " + HardProblems.length) // have to have this in the 'then()' block
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
}
JavaScript将在主区域中的所有内容运行后运行异步代码。因此,当您记录硬问题时,即使是在程序源中的异步代码之后,它也会在异步代码运行之前执行,这就是为什么您会看到一个空数组,因为它仍然是空的
Flavio很好地解释了异步代码和事件循环的工作原理。您在then()
的成功回调中异步更新了硬问题。尝试在foreach之后添加log-in回调方法。我想说的是,在查询之后,硬问题将被清除。我通过在方法中不声明硬问题(甚至在全局声明后也不初始化)来修复它。IDK这是怎么解决的。哦,是的,这只是范围界定。如果在函数体中声明了某个内容,则该内容仅在该函数的生命周期内持续,而不是在该函数完成之后。是的,在全局范围内声明硬问题可以解决这个问题。您也可以只从函数返回硬问题(只要它在.then()中),然后从外部访问它。