Arrays 我的计数器在退出循环后重置

Arrays 我的计数器在退出循环后重置,arrays,node.js,count,Arrays,Node.js,Count,每次第二个forEach循环退出后,我的计数器count都会重置,但这并不意味着要重置,因为当我在第二个循环中登录时,数字是正确的,但没有运气 let arr = []; var count; result.forEach(server => { count = 0; sql.query(`SELECT * FROM users WHERE server='${server.server}';`, async (error, results)

每次第二个
forEach
循环退出后,我的计数器
count
都会重置,但这并不意味着要重置,因为当我在第二个循环中登录时,数字是正确的,但没有运气

    let arr = [];
    var count;
    result.forEach(server => {
      count = 0;
      sql.query(`SELECT * FROM users WHERE server='${server.server}';`, async (error, results) => {
        if (error) {
          console.log(error);
        }
        results.forEach(user => {
          if(user.key_deactivated == 'false') {
            count++;
          }
        });
        console.log(count);
      });
      arr.push({
        server: server.server,
        name: server.name,
        plan_id: server.plan_id,
        mb_stripe: server.mb_stripe,
        description: server.description,
        key_stock: server.key_stock,
        channel: server.channel,
        active: count
      });
    });
        res.render('pages/administrator', {result: result, user: req.user, arr: arr});


您正在使用回调函数,回调函数是异步行为的一部分。表示js将其推送到回调队列,以便稍后执行。因此,在回调可以更改它之前,正在访问计数值

让arr=[];
var计数;
result.forEach(服务器=>{
计数=0;
sql.query(`SELECT*FROM users其中server='${server.server}';`,异步(错误,结果)=>{
如果(错误){
console.log(错误);
}
results.forEach(用户=>{
如果(user.key_已停用=='false'){
计数++;
}
});
控制台日志(计数);
arr.push({
服务器:server.server,
name:server.name,
计划id:server.plan\u id,
mb_stripe:server.mb_stripe,
description:server.description,
密钥库存:server.key\u库存,
频道:server.channel,
活动:计数
});
res.render('pages/administrator',{result:result,user:req.user,arr:arr});
});
});
有关回调的更多信息,请查看此

欢迎光临

“你们这些进来的人,放弃一切希望吧。”

但丁·阿利吉耶里

对您的问题的不那么富有诗意的描述是,您正在使用回调,并期望在看到它们之后的代码之前执行它们。但这不是它们的工作方式。让我解释一下您的代码的作用:

它迭代结果,对于每个实例,它将
count
设置为0,并异步等待查询执行,在等待查询执行时,它将对象(包含
count
)推送到
arr
。但是
count
尚未刷新,查询仍在执行中。把这个密码

  arr.push({
    server: server.server,
    name: server.name,
    plan_id: server.plan_id,
    mb_stripe: server.mb_stripe,
    description: server.description,
    key_stock: server.key_stock,
    channel: server.channel,
    active: count
  });

就在您的
控制台.log之后

那么为什么要在外部循环中包含
count=0
?只需将其放出来。它会在每台服务器上重置,但当推送到阵列时,它会推送到0,而不是原来注销的数字。如果仔细观察,arr.push位于循环结束之前,因此它应该推送到正确的信息。抱歉,忘了将渲染线添加到回调中。。现在它应该可以像预期的那样工作了,它可以渲染多次,不是吗?它只需要渲染一次