как я могу снова выполнить l oop после l oop fini sh, используя javascript - PullRequest
0 голосов
/ 06 августа 2020

В моем коде я хочу снова l oop после определенного условия, если (i === arr.length) соответствует. вот демонстрационный код. есть идеи, как я могу это решить?

var arr = [1,2,3];

for (let i = 0; i < arr.length; i++)
{
  setTimeout( function timer()
  {
      console.log("test");
      if(i === arr.length){
      // start the looping after this condition match
      }
  }, i*3000 );
}

Ответы [ 3 ]

0 голосов
/ 06 августа 2020

Проблема с вашим кодом, как сейчас, заключается в том, что l oop завершается до того, как запускается даже первый setTimeout обратный вызов. Добавление console.log после l oop подтверждает это.

var arr = [1,2,3];

for (let i = 0; i < arr.length; i++)
{
  setTimeout( function timer()
  {
      console.log("test");
      if(i === arr.length){
      // start the looping after this condition match
      }
  }, i*3000 );
}
console.log("Loop exited");

Таким образом, нет возможности перезапустить этот l oop. Однако вы можете реорганизовать свой код, чтобы продолжить цикл по arr с задержкой 3000 мс. Самый простой, наверное, с Promise.

var arr = [1,2,3];

async function doWork(item){
    return new Promise(resolve => {
        setTimeout(() => {
            console.log("finished",item); // do whatever you want to do here
            resolve();
        },3000);
    });
}


async function test(){
  var exit = false; // if you set this to true elsewhere the code will stop
  var i = 0;

  while(!exit){
    var item = arr[i++ % arr.length];
    await doWork(item);
  }
}

test();
0 голосов
/ 06 августа 2020

Вот простая попытка, надеюсь, вы найдете ее полезной

var arr = [1, 2, 3];
var i = 0;

var i = 0;

function timer() {
  console.log(arr[i])
  i = (i + 1) % arr.length;
}
setInterval(timer, 1000);
0 голосов
/ 06 августа 2020

Ваш код никогда не достигает условия, так как i

затем повторно введите l oop Я предлагаю вам инкапсулировать все ваши l oop в функцию

var arr = [1,2,3];

for (let i = 0; i < arr.length; i++)
{
  setTimeout( function timer()
  {
      console.log("test");
      if(i === arr.length){
      // start the looping after this condition match
      }
  }, i*3000 );
}

To

var arr = [1,2,3];

function Looper(){
   for (let i = 0; i <= arr.length; i++)
   {
     setTimeout( function timer()
     {
         console.log("test");
         if(i === arr.length){
             Looper();
         }
     }, i*3000 );
   }
}

Looper();

Имейте в виду, что это бесконечное l oop, вы лучше использовать setInterval, если это ваша цель, но если у вас есть что-то еще, надеюсь, это поможет.

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