2016-10-13 2 views
0

У меня есть фрагмент кода с циклом while, который я хотел бы остановить с помощью setTimeout(). Но это похоже на бесконечный цикл, который никогда не запускает setTimeout(). Если я удаляю цикл while, тайм-аут срабатывает правильно. Что не так, пожалуйста?Как закончить бесконечный цикл while через setTimeout в Javascript

$(document).ready(function() 
{ 
    var i = 0, s = false; 

    setTimeout(function() 
    { 
     s = true; 
     console.log("Timeuot!!!"); 
     console.log("s value is " + s); 
    }, 1000); 

    while(s === false) 
    { 
     console.log("this is while and s is " + s); 
     i++; 
    } 

    console.log("iterations: " + i); 
}); 
+0

@Quentin в 's' внутри SetTimeout устанавливается в глобальном масштабе. почему я ошибаюсь? –

+0

@RoyiNamir - Функция, переданная 'setTimeout', определена внутри другой функции. Он имеет доступ к объему этой функции. Поскольку в этой области существует неглобальный '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – Quentin

+0

@RoyiNamir h s внутри setTimeout является одним из охватывающих областей, поэтому один объявил и определил пару строк выше. – pinturic

ответ

6

JavaScript запускает один цикл событий. Он не останавливается в середине функции, чтобы увидеть, есть ли какие-либо события (например, клики или тайм-ауты), которые будут запускать другую функцию.

Вкратце: он не будет запускать функцию времени, пока цикл while не завершится.


Для этого вы обычно должны иметь итератор, инициированный событиями.

var i = 0, 
 
    s = false; 
 

 
setTimeout(function() { 
 
    s = true; 
 
    console.log("Timeuot!!!"); 
 
    console.log("s value is " + s); 
 
}, 1000); 
 

 
next(); 
 

 
function next() { 
 
    if (s) { 
 
    return done(); 
 
    } 
 
    console.log({ 
 
    s, i 
 
    }); 
 
    i++; 
 
    setTimeout(next, 0); 
 
} 
 

 
function done() { 
 
    console.log("iterations: " + i); 
 
}

+0

Mmmm. Но он останавливается и показывает, что это не бесконечный цикл .http: //jsbin.com/cewewarovo/1/edit? Html, js, console, output –

+0

@RoyiNamir - JSbin, похоже, искажает код, чтобы остановить людей, совершающих атаки DOS с помощью Это. 'while (s === false) {if (window.runnerWindow.protect.protect ({line: 13})) break; window.runnerWindow.proxyConsole.log (« это while и s is »+ s); i ++ ;} '- Он добавляет' break' туда. – Quentin

+0

Благодарим за пояснения –

0

SetTimeout никогда не вызывается сделать тот факт, что в то время как никогда не заканчивается, и поэтому даже диспетчер не собирается инициировать SetTimeout.

+0

Да, у меня оно есть. Благодарю. –

1

Как уже упоминалось блоки, в то время как петли с одной и только нити. Для того, чтобы ваш пример делать то, что вы хотите, замените время цикла с setInterval (функция), как это:

$(document).ready(function() 
{ 
    var i = 0, s = false; 

    setTimeout(function() 
    { 
     s = true; 
     console.log("Timeout!!!"); 
     console.log("s value is " + s); 
    }, 1000); 


    var interval = setInterval(function() { 
     console.log("this is while and s is " + s); 
     i++;  
     if (s) { 
     clearInterval(interval); 
     console.log("i is " + i) 
     } 
    }, 100);  
}); 
+0

Да, у меня есть. Спасибо за пример. –

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