2016-03-15 3 views
0

Я пытаюсь вывести окно предупреждения с сообщением «привет» каждые 2 секунды, но только 5 раз. Поэтому я написал этот код:setTimeout in do while loop

var counter = 1; 

do { 
    setTimeout 
    (
     function() 
     { 
      alert("hello"); 
      counter++; 
     }, 
     2000 
    ); 
} while(counter <= 5); 

Но моя страница постоянно рушится? Зачем? Каков наилучший способ добавить задержку в 2000 мс между предупреждениями?

+0

Возможный дубликат [Можно ли цепь SetTimeout функций в JavaScript?] (Http://stackoverflow.com/ вопросы/6921275/is-it-possible-to-chain-settimeout-functions-in-javascript) – smnbbrv

ответ

4

Но моя страница падает каждый раз? Зачем?

Поскольку счетчик только увеличивается в обратном вызове - цикл, вероятно, пытается запустить тысячи (если не десятки тысяч) раз за это время и быстро запускает браузер из памяти. Точнее, как указано в комментариях, цикл никогда не отказывается от управления вызовом setTimeout, поэтому никогда не будет запускаться (не беспокойтесь о различии здесь - просто примите, чтобы ваш счетчик не увеличивался)

Что лучший способ, чтобы добавить задержку между 2000 мс оповещения

пнуть следующий только предыдущий заканчивается.

function showHello(i){ 
    if(i<5){ 
    setTimeout 
    (
     function() 
     { 
      alert("hello"); 
      showHello(i+1) 
     }, 
     2000 
    ); 
    } 
} 

showHello(0); 

Связанный: Is it possible to chain setTimeout functions in Javascript? и how to make a setInterval stop after some time or after a number of actions?

+2

«в то время» - это никогда не доходит до этого. Цикл событий JS слишком занят, запустив 'while', чтобы узнать, закончились ли какие-либо таймеры, поэтому никогда не будет срабатывать функция тайм-аута. – Quentin

+0

Обратный вызов тайм-аута никогда не выполняется на самом деле, потому что цикл никогда не отказывается от контроля. Вы можете установить задержку на 0, и она все равно будет разбита. –

+0

Вы оба абсолютно точны, конечно. Поскольку ОП борется с этой концепцией, я думаю, мы можем предположить, что они просто путают их. Я обновил ответ, тем не менее – Jamiec

0

Используйте setInterval вместо:

var counter = 0; // setting the counter 
var interval = setInterval(function(){ //setInterval does repeatedly what setTimeout only 
             //does once 
    counter++; 
    if(counter === 5){ 
     clearInterval(interval); //if the counter reaches 5 (the times you asked 
           //for repeating the alert box) you clear the interval, 
           //stopping the loop 
    } 
    alert("hello"); 
}, 2000); 

Вот рабочая скрипку: https://jsfiddle.net/mwosm34x/

+3

Это отвечает только на часть вопроса и не дает объяснений этому решению. –

+1

@FelixKling сделал некоторые комментарии к коду, надеюсь, что это лучше объяснено сейчас (я новичок в ответе на stackoverflow, все еще нужно совершенствовать ответы на вопросы) –

0

Используйте setInterval вместо этого.

И clearInterval(), когда счетчик больше 5.

var counter = 1; 
 

 
var timer = setInterval(function() { 
 
    alert("hello "+counter); 
 
    counter++; 
 
    if (counter > 5) { 
 
    clearInterval(timer); 
 
    } 
 
}, 2000);

+2

«Попробуй это» без объяснения кода, или что-то не помогло никому – Jamiec