Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Как сделать задержку?


Автор: Wowa 1.5.2007, 10:00
Есть два варианта:

Код

function hierGehtsLos()
{
  window.setTimeout("hierGehtsWeiter()", 3000);
}

function hierGehtsWeiter()
{
  // Через 3 секунды будет вызвано
  window.alert("Видешь?");
}


Код

function delay(prmSec)
{
 prmSec *= 1000;
 
 var eDate = null;
 var eMsec = 0;
 
 var sDate = new Date();
 var sMsec = sDate.getTime();
 
 do {
 eDate = new Date();
 eMsec = eDate.getTime();
 
 } while ((eMsec-sMsec)<prmSec);




function init()
{
 // Start Pause with 10 seconds.
 delay(10);
 self.alert("Ready after 10 seconds");
}


Автор: Zeroglif 1.5.2007, 12:34
Псевдо-задержку делает второй вариант, где js-интерпретатор принудительно загружен работой и не идёт дальше (может и пойти в отдельных трудноуловимых случаях), пока её не выполнит. В этом мало красоты ибо скрипт сильно грузит машину, есть риск не вывалиться из цикла и т.п.

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

Есть ещё варианты с диалоговыми окнами, которые держат скрипт, но это не всегда работает и не особо радует пользователя.

Автор: Royan 31.7.2007, 10:36
Я не знаю по каким причинам здесь не приведен самый правильный вариант задержки, а именно через window.setInterval()

Важно понимать разницу между setTimeout и setInterval В первом случае для обеспечения повторения через заданный промежуток времени, вам необходимо организовать рекурсию или косвенную рекурсию. То есть, например, разместить строку window.setTimeout("hierGehtsWeiter()", 3000); в методе hierGehtsWeiter() В случае же setInterval, никакой рекурсии не нужно. Более того вызов этой функции может происходить из любого места. Собственно вызов приведет к тому что, заданная в первом параметре функция или метод будут вызываться через, заданное во втором параметре количество миллисекунд. Единственным неприятным моментом в использовании window.setInterval() является необходимость хранить значение интегрального идентификатора интервала, который используется для остановки работы этой функции. Этот интервал возвращается методом window.setInterval() и используется в методе window.clearInterval()

Для пущей ясности привожу пример:
Код

var oInterval;

function fnStartInterval(){
   oInterval = window.setInterval("fnRecycle()",1000);
}


function fnRecycle(){
   // Код, выполняющийся каждую секунду 
}

function fnStopInterval(){
   window.clearInterval(oInterval);
}


Автор: Zeroglif 31.7.2007, 11:16
Цитата(Royan @  31.7.2007,  10:36 Найти цитируемый пост)
Я не знаю по каким причинам здесь не приведен самый правильный вариант задержки, а именно через window.setInterval()

это не задержка (sleep), а отложенное исполнение от точки вызова (ноль), что никак не может удерживать интерпретатор;
setInterval по сравнению с setTimeout не является более правильным, один для разового исполнения, другой - нет;
- для обеспечения повторений через setTimeout можно обойтись и без рекурсии, но в любом случае для повторений setInterval удобнее;
- хранить id таймаутов для последующей "очистки" желательно и в отношении setTimeout-ов во избежание багов;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)