var count=0;
function test2(callback) {
db.doc("Kerala/Pathanamthitta")
.listCollections()
.then((snap) => {
snap.forEach((collection) => {
var col = collection.id;
db.collection(`Kerala/Pathanamthitta/${col}`)
.where("completionStatus", "<", 3)
.get()
.then((snapshot) => {
snapshot.forEach((doc) => {
var data = doc.data();
console.log(data.place);
if (data.completionStatus == 0) count++;
});
});
});
})
.then(callback);
}
test2(function () {
console.log(count);
});
我想打印test2函数执行后的最终计数。它打印的语句,但总是0,即使任何更新发生在函数test2内。我试图做一个回调(),但还是一样的发生请帮助。谢谢你的帮助。
你误解了异步函数和承诺链的工作原理。你在调用一个承诺链和回调之后就直接调用了。
db.doc(...)...
callback()
这最终的执行结果是这样的。
db.doc
callback
db.doc.then
在这一点上,你已经在承诺链的解析之前调用了回调。你要把回调放在承诺链中,这样它就会被延迟到所有这些都完成之后。一个好的位置是在外循环之后的另一个承诺链中,用于最终计数的单条日志。
...
.then(snap => {
snap.forEach(collection => {...});
})
.then(callback);
...
这样在你完成了所有的快照,并完成了对快照的计数之后,你就会按照两次遍历后的正确顺序打印出计数。
但是等等,它仍然在打印0,这是为什么呢?好吧,我们没有正确地将我们的承诺链起来。我们需要确保我们在一个承诺中创建的任何承诺都能正确地链起来,这样当我们进入日志记录步骤时,我们就会有一个正确的链。
完整的代码。
var count = 0;
function test2(callback) {
db.doc("Kerala/Pathanamthitta")
.listCollections()
.then((snap) => {
return Promise.all(
snap.map((collection) => {
var col = collection.id;
return db
.collection(`Kerala/Pathanamthitta/${col}`)
.where("completionStatus", "<", 3)
.get()
.then((snapshot) => {
return Promise.all(
snapshot.map((doc) => {
var data = doc.data();
console.log(data.place);
if (data.completionStatus == 0) count++;
})
);
});
})
);
})
.then(callback);
}
test2(function () {
console.log(count);
});
//content above
snapshot.forEach(doc => {
var data = doc.data();
console.log(data.place);
if (data.completionStatus == 0) count++;
});
functionTwo(count);
// content below
functionTwo(count) {
console.log(count);
}