2016-05-29 3 views
-1

Допустим, эта функция работает:Как нарушить цикл в Javascript?

var runningFunction = "none", 
    foo    = 1000, 
    counter   = 0; 

function someFunc() { 

    runningFunction = "someFunc"; 

    from(var i = 0; i < foo; i++) { 

     counter++; 

    } 

} 

и я хотел сломать, что, скажем, при обнаружении window.resize

$(window).resize(function() { 

    // break someFunc function 
    // say scenario broke at count = 595 

} 

Как я могу это сделать? Я могу написать некоторую переменную, которая работает, как показано выше.

+1

Javascript имеет ** запуска до завершения ** семантику. Это означает, что 'someFunc' будет блокировать все до возвращения. Если вы хотите неблокирующее поведение, посмотрите более внимательно на асинхронное программирование, ** цикл событий ** и ** упреждающую многозадачность **. – rand

+0

@ Я благодарю за это, я прочитаю об этом, мне нужно сделать эту работу, иначе моя работа будет иметь известный недостаток, несмотря на то, что это проблема языка. – joehungjohn

+0

Почему бы просто не добавить условный разрыв внутри цикла for ?: if (ready) {break; } –

ответ

3

Вы не можете. Весь код в функции будет выполняться в блоке. Другие коды, такие как resize event listeners, будут ждать завершения функции.

Если вы действительно хотите «приостановить» его, вам нужно разбить его на разные функции и использовать setTimeout для вызова следующего. Это позволит запустить другой код в середине.

var timer, 
 
    counter = 0, 
 
    result = document.getElementById('result'); 
 
function someFunc() { 
 
    counter++; 
 
    result.textContent = counter; 
 
    if(counter < 1e5) timer = setTimeout(someFunc, 0); 
 
} 
 
someFunc(); 
 
document.getElementById('stop').addEventListener('click', function() { 
 
    clearTimeout(timer); 
 
});
Counter: <span id="result"></span><button id="stop">Stop counter</button>

+0

Проблема в том, что я пытаюсь остановить анимацию, чтобы изменить размер/переместить элементы, а затем сбросить анимацию ... потому что сейчас элементы не изменяются, потому что, как вы сказали, анимация должна заканчиваться, и эти анимации уже разбиты на сегменты. Но каждый сегмент сам не может остановиться. Итак, я получаю эти гигантские/неуместные элементы. – joehungjohn

+0

Ничего себе это здорово, это может быть единственным решением этой проблемы, и если так, спасибо. Я попытаюсь понять ваш код, а затем реализовать его в своем коде. Еще раз спасибо. До сих пор я не слышал о clearTimout. – joehungjohn

+0

'clearTimeout' удаляет таймер' setTimeout' из очереди. – Oriol

Смежные вопросы