Node.js: выполнение после цикла for - PullRequest
0 голосов
/ 29 ноября 2018

Я создаю какое-то приложение Node.js и у меня есть такая функция:

function ex() {
  allowUA = false;

  for (var i = 0; i < arr.length; i++) {
    (function(index) {
      setTimeout(() => {
        console.log(index);
      }, i * 3000);
    })(i);
  }

  if (i == arr.length - 1) {
    allowUA = true;
  }
}

Все, что я хочу, это чтобы эта функция выполнялась в строгом порядке (изменение переменной на false, выполнение цикла, а затемизменив переменную обратно на true)

Я обнаружил, что это не так просто, как кажется, поэтому я прошу вашей помощи.

Есть ли способ сделать это?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вот метод async/await, который исключает цикл for / в пользу setTimeout, который вызывает функцию с медленно сокращающимся массивом:

async function ex(arr) {
  allowUA = false;
  console.log(allowUA);

  function logger(arr) {
    return new Promise((resolve, reject) => {
      (function loop(arr) {
        const [head, ...rest] = arr;
        if (!arr.length) {
          resolve();
        } else {
          console.log(head);
          setTimeout(() => loop(rest), head * 1000);
        }
      }(arr));
    });
  };
  
  await logger(arr);

  allowUA = true;
  console.log(allowUA);
}

const arr = [1, 2, 3, 4];
ex(arr);
0 голосов
/ 29 ноября 2018

Вы можете использовать Promise, чтобы убедиться, что тайм-аут разрешается первым, а затем регистрировать следующее условие, когда все обещания разрешаются.

let allowUA = false;
let arr = [1, 2, 3]

function ex() {
  allowUA = false;
  console.log('false');

  // iterate over the array and create a promise for each iteration
  let promises = arr.map(function(value, index) {
    return new Promise(function(resolve) {
      setTimeout(() => {
        console.log(index);
        // resolve the promise
        resolve();
      }, index * 500);
    });
  })

  // run this when all the promises resolve themselves
  Promise.all(promises).then(function() {
    allowUA = true;
    console.log('true');
  });
}

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