2015-09-04 5 views
1

Поскольку setTimeout падает во время циклов.JS setTimeout in while loop

Я не знаю, есть ли способ сделать это, но я пытаюсь это сделать. Вот как это выглядит.

<script> 
var send = true; 
function sendit() 
{ 
    alert("test"); 
    return true; 
} 
while(true) 
{ 
    if(send == true) 
    { 
     send = false; 
     setTimeout(function(){ 
      if(sendit() == true) { 
       send = true; 
      } 
     }, 5000); 
    } 
} 
</script> 

Возможно ли так?

+1

Возможно, это проблема [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) - что вы пытаетесь решить? Ваш код здесь будет заблокирован, как только вы установите 'send = false', поскольку javascript является однопоточным, и он застрял в цикле' while (true) 'на этом этапе, без каких-либо шансов на время ожидания. –

+0

Возможный дубликат: http://stackoverflow.com/questions/12996193/settimeout-inside-while-loop –

+0

@James Thorpe Ну это не возможно, о, хорошо ... –

ответ

2

Вы не объяснили, что хотите сделать для своего кода. Если вы хотите, чтобы предупредить «тест» каждые 5 секунд, после чего вам это нужно:

<script> 
function sendit() 
{ 
    alert("test"); 
    // Call sendit() the next time, repeating 
    setTimeout(sendit, 5000); 
} 
// Call sendit() the first time 
setTimeout(sendit, 5000); 
</script> 

Нет необходимости в цикле, просто получить функцию, чтобы запланировать себя снова.

+1

Это то, что я хотел, я также узнал, что setInterval() архивирует эффект. –

+1

Почти так. setInterval() позволит 'sendit()' функциям перекрываться (если они занимают много времени), тогда как вышеприведенный код будет ждать завершения 'sendit()', прежде чем ждать еще 5 секунд. – foz

+1

Лучше сказать, что, поскольку JS является однопоточным, использование setInterval с функцией, которая занимает больше времени, чем указанный интервал, сразу вызовет функции один за другим (возможно, замораживая браузер). В этом случае вызов setTimeout/setTimeout лучше. Однако, если время выполнения функции меньше интервала, и вам нужно ** фиксированную задержку между вызовами **, то вы должны использовать setInterval. – Ma3x

0

Я понимаю, что вы пытаетесь сделать это эквивалентом Thread.sleep(5000) на языке Java или C#. Эта функциональность не существует в JavaScript. Если вы хотите сделать что-то определенное количество времени после выполнения вашей функции, поместите ее в тайм-аут, но так или иначе, эта первая функция будет завершена в том же фрейме, если вы не выполняете огромную работу.

В настоящее время ваш код устанавливает тайм-аут на sendit() практически бесконечное количество раз, прежде чем он вернется. Поскольку JavaScript является однопоточным, даже если прошло 20 секунд, он все равно не завершил бы вашу функцию и не смог бы начать поиск тайм-аутов, которые необходимо обработать. То, что вы должны делать, это что-то вроде того, что внутри таймаута установлен другой тайм-аут, и удалите прилагаемый while(true). Это может позволить бесконечное, периодическое поведение, как я думаю, вы ищете.