Как выйти из бесконечно запущенного цикла в JavaScript? - PullRequest
0 голосов
/ 01 октября 2011

Можно ли вообще остановить бесконечный цикл?

Сейчас я делаю что-то вроде этого:

var run = true;

loop ({
  if(run) {
  whatever
  }
}, 30),

Затем, когда я хочу остановить это, я изменяю run на false и на true, когда я хочу запустить его снова.

Но цикл всегда работает, что бы я ни делал. Это просто не выполнение кода внутри.

Есть ли способ остановить это полностью? и снова начать, когда я захочу?

Ответы [ 6 ]

5 голосов
/ 01 октября 2011

Если я правильно понимаю ваш вопрос, вам нужно ключевое слово break. Вот пример .

1 голос
/ 01 октября 2011

SetInterval даст вам цикл, который вы можете отменить.

setInterval ( "doSomething()", 5000 );

function doSomething ( )
{
  // (do something here)
}

Установите интервал на небольшое значение и используйте clearinterval для его отмены

0 голосов
/ 01 октября 2011

Проблема в том, что в javascript есть только один поток для запуска.Это означает, что пока вы бесконечно зацикливаетесь, больше ничего не может произойти.В результате ваша переменная никогда не сможет измениться.

Одним из решений этого является использование setTimeout для цикла с очень небольшим временем, отведенным на него.Например:

function doStuff(){
   if(someFlag){
      // do something
   }

   setTimeout(doStuff,1);
}

doStuff();

Это даст возможность другим действиям использовать поток и потенциально изменить флаг.

0 голосов
/ 01 октября 2011

Использование цикла while

while(run){
    //loop guts
}

Когда run ложно, цикл завершается. Поместите его в функцию и вызовите его, когда вы захотите снова начать цикл.

0 голосов
/ 01 октября 2011

Возможно, это не совсем то, что вы ищете, но вы можете попробовать setInterval.

var intervalId = setInterval (myFunc, 0);

function myFun() {
    if(condition) {
        clearInverval(intervalId);
    }
    ...
}

setInterval также не будет блокировать страницу. Вы очищаете интервал, как показано с помощью clearInterval.

0 голосов
/ 01 октября 2011
function infiniteLoop() {
    run=true;
    while(run==true) {
        //Do stuff
        if(change_happened) {
            run=false;
        }
    }
}
infiniteLoop();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...