Мой счетчик сбрасывается после выхода из цикла - PullRequest
1 голос
/ 01 мая 2020

Мой счетчик count сбрасывается после каждого выхода второго forEach l oop, но его не нужно сбрасывать, поскольку, когда я консоль регистрирую внутри второго l oop, числа верны, но без удачи.

    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 ]

1 голос
/ 01 мая 2020

вы используете функцию обратного вызова, а функция обратного вызова является частью асинхронного поведения. означает 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

0 голосов
/ 01 мая 2020

Добро пожаловать в обратный вызов ада .

"Оставь все надежды, входящие сюда."

Данте Алигьери

Менее поэтическое c описание вашей проблемы заключается в том, что вы используете обратные вызовы и ожидаете, что они будут выполнены до кода, который вы увидите после них. Но это не так, как они работают. Позвольте мне объяснить, что делает ваш код:

Он повторяет результат и для каждого экземпляра устанавливает 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
  });

сразу после вашего console.log.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...