Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Пауза выполнения кода на JS как Thread.sleep (https://javascript.ru/forum/server/12484-pauza-vypolneniya-koda-na-js-kak-thread-sleep.html)

Aetae 22.09.2012 03:51

Повторяю ответ: пауза в цикле не нужна.

Вызов чего-либо по временному интервалу в JavaScript осуществляется с помощью интервалов и таймеров(setInterval, setTimeout). Циклы в этом вообще не участвуют.

Читайте статьи по ссылкам в этой теме до полного понимания.

var i = 3; //кол-во повторений;
var interval = setInterval( //задаём интервал
	function(){ //анонимная функция обёртка, вместо неё можно передавать функции по имени
		soundManager.play('mySound2'); //исполняем нужный вам код
		if(--i <= 0) clearInterval( interval ); //если закончилось заданное кол-во повторений - сбрасываем интервал 
	},
	3 * 1000 //время повтора в мс 
)

sotik 23.09.2012 12:56

Приветствую. Ребят, я опять за помощью. :)
function Zazor($)
{
if($==1) clearTimeout(zazor);
else var zazor = setTimeout("alert('Приехали')", 4000);
}

<span onclick="Zazor()">Зеленый</span><br>
<input type="button" value="Останов" onclick="Zazor(1)" />

При клике на "Зеленый" запускается таймер,
при клике на "Останов" таймер не выключается.
Как это поправить?

Gvozd 23.09.2012 13:32

Вы используете локальную переменную zazor, и естественно, что при каждом выполнении функции она не равна своему предыдущему значению
Используйте либо глобальную переменную, либо используйте замыкание

sotik 23.09.2012 15:19

function Zazor($)
{
if($==1) clearTimeout(zazor);
else var zazor = function(){
setTimeout("alert('Приехали')"}, 4000);
}

так что ли...
не работает.
И странно,что нельзя без всяких условий этосделать и останавливать кнопкой (clearTimeout(zazor)), потому что alert срабатывает сразу же,не дожидаясь 4 сек.

Gvozd 23.09.2012 18:03

Цитата:

Сообщение от sotik
так что ли...
не работает.

Нет разумеется.
Вы написали синтаксически неверный код, который заведомо не будет выполнятся
Перечитайте еще раз мой ответ
Если замыкания для вас слишком сложны, то используйте более простой вариант, описанный мною до слова "либо"

Dim@ 23.09.2012 20:05

JSBeginner,
то что вы хотите в цикле сделать НЕЛЬЗЯ итерация цикла проходит за сотые доли секунды и то что вы ставите на setTimeout будет выполнятся в одно и тоже время

Dim@ 23.09.2012 20:12

function Zazor($)
{
if($==1) clearTimeout(zazor);
else var zazor = function(){// вы создали локальную переменную которую уже нельзя будет остановить вызовом другой функции (другой контекст)
setTimeout("alert('Приехали')"}, 4000);
}

как вам Gvozd уже сказал используются разные переменные, надо так
<script>
var zazor = null;//глобальная переменная которую можно использовать везде
function Zazor($)
{
if($==1) clearTimeout(zazor);
else zazor = setTimeout("alert('Приехали')", 4000);
}
</script>
<span onclick="Zazor()">Зеленый</span><br>
<input type="button" value="Останов" onclick="Zazor(1)" />

sotik 24.09.2012 06:25

Спасибо за пояснения,теперь все работает.
Далее вот это...
var ovec =0;
var zazor;
// Игровые функции
function ivolga(so,put)
{
if(so!=0)
{
clearTimeout(zazor);
ovec++;
if(so != cvet[ovec]){ //проверка совпадения цветов
soundManager.play('mySound5');
return;
}else if(ovec==cvet.length){ //проверка окончания серии
alert('Победа!');
return;
}
soundManager.play('mySound' + so);
return
}
}

// формирование цветов
var cvet = [];
function Start()
{
cvet.length=0;
ovec=0;
for(var i=0;i<2;i++){ // генерируем цвета
cvet.push(getrandom(1,4));
}
}

<span onclick="Start()">Пуск</span>
<br>
<span onclick="ivolga(1)">Желтый</span><br>

Вот вроде все правильно, но почему-то всегда идет ошибка совпадения цветов и "победа" тоже не наступает.. :)

sotik 24.09.2012 13:49

Тут уже разобрался. В функции Start() переменной ovec нужно -1 присваивать, и далее эту же переменную правильно сопоставлять.


Часовой пояс GMT +3, время: 06:24.