09.02.2008, 08:22
|
|
Использование таймера
Задача: реализовать отображение отсчета времени до закрытия окна.
Для реализации использую вот такие функции:
function Repl(ch)
{
var str = document.getElementById('ans').value;
str = str.replace(ch+1,ch);
document.getElementById('ans').value= str;
}
function CloseWindowTimer()
{
setTimeout("Repl(2);", 1000);
setTimeout("Repl(1);", 1000);
setTimeout("Repl(0);", 1000);
setTimeout("window.close();", 500);
}
на форме лежит <INPUT TYPE=submit name='ans' id='ans' VALUE='closing for 3 sec...'>
по зажумке на кнопке должен идти отсчет: 3сек... 2сек.. 1сек... 0сек... <полсекунды и закрытие>
на самом деле отсчет 3-2-1-0 происходит за один раз (2сек и 1сек зрительно не видно) и окно закрывается. В чем проблема? Такое ощущение, что setTimeoutы отрабатываются одновременно - почему?
(браузер Opera, IE7)
|
|
25.02.2008, 14:21
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от Strimer
|
Такое ощущение, что setTimeoutы отрабатываются одновременно - почему?
|
потому что Вы их запускаете "одновременно", все они отработают через одну секунду (кроме последнего, который должен через полсекунды, т.е. раньше еще). setTimeout / setInterval работают с "отложенным временем", т.е. в Вашем примере абсолютно не значит, что setTimeout("Repl(1);", 1000); сработает через секунду после первого, а наоборот - все три - через секунду. Операции, идущие после setInterval'a будут продолжаться. Через секунду тред приостанавливается и "вклиниваются" три тайм-аута. В FF есть скрытый параметр задержки тайм-аутов (и интервалов), который, возможно, приводит к нужному результату (ну раз проблема только в Опере и IE), хотя, вряд ли.
|
|
26.02.2008, 23:12
|
|
|
Регистрация: 21.02.2008
Сообщений: 1,250
|
|
Как сказал ds [.code], setTimeout создает ответвление от основного выполнения программы, так что в этом коде, по сути, не выполняется Repl(), т.к window.close() срабатывает на полсекунды раньше первого Repl().
К сожалению, в javascript нет реализаций функций остановки выполнения основной программы, по типу sleep или wait.
Как решение, можно запускать эту функцию в setInterval и считать кол-во вызовов, либо разницу во времени.
|
|
27.02.2008, 00:50
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Андрей Параничев,
Сообщение от Андрей Параничев
|
К сожалению, в javascript нет реализаций функций остановки выполнения основной программы, по типу sleep или wait.
|
на самом деле, сожаления нет =) иначе браузер бы повис - JavaScript однотредный язык (хотя, setTimeout и setInterval можно вынести во мнимый второй тред (первый прорисовывает окно, второй работает с "отложеным временем"), но в реале происходит лишь "вклинивание" в основной поток по истечению интервала).
Если Вас интересует синхронный дилэй с подвешиванием браузера (как например, модальное окно alert(...)), то можно использовать разницу миллисекунд объекта Date.
|
|
27.02.2008, 02:07
|
|
|
Регистрация: 21.02.2008
Сообщений: 1,250
|
|
ds [.code],
Кстати да, я совсем не подумал об этом. Действительно ведь setTimeout и setInterval не являются в полной мере тредами. Точнее они совсем ими не являются, получается, если какую-нибудь функцию поставить на тайм-аут, то когда пройдет время тайм-аута функция всё-равно будет выполнятся в основной программе (прервав её выполнение)?
|
|
29.02.2008, 13:29
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
странно, или форум гюканул или кто-то удалил мой пост (я уже отвечал на этот вопрос)
Сообщение от Андрей Параничев
|
получается, если какую-нибудь функцию поставить на тайм-аут, то когда пройдет время тайм-аута функция всё-равно будет выполнятся в основной программе (прервав её выполнение)?
|
да, именно так. Были реализации псевдо мультипоточности в JS (а с версии JS 1.7. и c ее yield, generator, iterator и прочими - еще легче, например - Threading in JavaScript 1.7 + демо), но все они, псевдо, т.к. JS - однотредный язык.
|
|
29.02.2008, 13:33
|
|
|
Регистрация: 21.02.2008
Сообщений: 1,250
|
|
Да, я тоже удивился. Я тогда прочитал твой ответ, а потом он куда то пропал
|
|
07.09.2008, 01:22
|
|
А у нас вроде как мультипочность наблюдаеться...
Ну вообщем фиг знает какой он там псевдо (кстати что вы имеете в виду этим словом) или не псевдомультипоточный на третьей лисе и вроде даже на iE6 замечательно идут и главная и куча параллельных функций одновременно.
P.S. Я сам сразу не вьехал что setTimeOut это не спящая функция =)
|
|
|
|