在Node js中访问函数外的变量 [重复] 。

问题描述 投票:0回答:2
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内。我试图做一个回调(),但还是一样的发生请帮助。谢谢你的帮助。

javascript node.js google-cloud-firestore
2个回答
1
投票

你误解了异步函数和承诺链的工作原理。你在调用一个承诺链和回调之后就直接调用了。

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);
});

0
投票

按照我的评论,你可以在完成计数后调用一个函数。

//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);
}
© www.soinside.com 2019 - 2024. All rights reserved.