退出循环后,我的计数器被重置

时间:2020-05-01 15:20:19

标签: arrays node.js count

每次第二个count循环退出后,我的计数器forEach都会重置,但这并不意味着要重置,因为当我在第二个循环内进行控制台日志时,数字是正确的,但是没有运气。

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

2 个答案:

答案 0 :(得分:1)

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

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

有关回调的更多信息,请查看此内容。 https://developer.mozilla.org/en-US/docs/Glossary/Callback_function

答案 1 :(得分:0)

欢迎使用callback hell

“放弃所有希望,进入这里的人们。”

但丁·阿利吉耶里

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

迭代结果,并为每个实例将count设置为0,并异步等待查询执行,并在等待查询执行的同时,不实际等待查询执行,而是推送对象(包含{{ 1}})到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 }); 之后。