Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Пауза на JavaScript. (Mozilla only)


Автор: Sattu 2.5.2004, 13:06
Здраствуйте.

Уважаемые господа, как корректно и красиво реализовать субж только для Mozilla? Я пробовал так:

1)
Код
function pause(numberMillis) {
   var now = new Date();
   var exitTime = now.getTime() + numberMillis;
   while (true) {
       now = new Date();
       if (now.getTime() > exitTime)
           return;
   }
}

Но даный метод очень сильно нагружает баузер.

2)
Код
document.write("first<br>");
setTimeout("document.write('second<br>');", 2000);
document.write("third<br>");

Все равно делает не то... выводит:
first
third
(пауза)
second (вытирая две предыдущие строки)

Как сделать правильно?

Автор: Sardar 2.5.2004, 17:02
Цитата
только для Mozilla
что не есть гуд... будем писать под все браузеры.
Так, разберемся что ты хочешь сделать! smile.gif
Мне так кажется что ты хочешь что бы некий текст добавлялся в конец страницы через паузу(usleep...) и возможно дальше идет остальная часть страницы...

window.setTimeout не останавливает процесс выполнения - это правильно smile.gif Тогда можно сделать очередь дейстие/время + небольшой код который будет доставать из очереди следующее действие.
Код

utimer.timer=null; //ссылка на таймер, нужна что бы оборвать его
utimer.inprocess=false; //очередь запущенна
utimer.qtime=[]; //время
utimer.qfunc=[]; //действие

/**
* Поставить действие в очередь.
* void utimer(int mstime, function func, object owner=null[,arg...]);
* mstime - пауза в милисекундах
* func - указатель на вызывемую функцию обработчик
* owner - обьект, если задан, то вызыватся его метод(специфируется контекстом)
* args... - любое количество аргументов дальше.
*/
function utimer(mstime,func,owner) {
utimer.qtime.push(mstime);
//идиотиз, но arguments не имеет метода slice... =/
for(var i=1, arg=[]; i<arguments.length; i++) arg.push(arguments[i]);
utimer.qfunc.push(arg);
if(!utimer.inprocess) utimer.nextPaused();
}
/**
* Выполнить следующее действие. Вызываешь если надо сбросить текущий таймер и
* немедленно выполнить действие.
*/
utimer.nextPaused=function() {
if(utimer.inprocess) { // делаем полезную работу
 var trgt=utimer.qfunc.shift();
 var arg=trgt.length>2? trgt.slice(2): null;
 if(typeof(trgt[1])=="object") trgt[0].apply(trgt[1],arg);
 else trgt[0](arg);
}
if(utimer.timer) window.clearTimeout(utimer.timer);
if(utimer.qtime.length>0) { //есть еще действия?
 utimer.timer=window.setTimeout(utimer.nextPaused, utimer.qtime.shift());
 utimer.inprocess=true;
} else { //нет тогда останавливаем очередь
 utimer.timer=null;
 utimer.inprocess=false;
}
}

Теперь мы можем поставить любое действие на очередь по времени, т.е. действие выполнится по прерыванию таймера.
Код

//допишем в слой
function writeText(text) {
document.getElementById("container").innerHTML+="<br><b>"+text+"</b>";
}
utimer(2000,writeText,null,"Напишем за 2с");
utimer(1000,writeText,null,"А это за 1с");
utimer(3000,writeText,null,"Этот текст за 3с");
utimer(4000,writeText,null,"И самый долгий за 4 секунды");
//действия поставленны на очередь, и скрипт продолжает выполнение
alert("я вызовусь раньше чем в слой будет что либо написанно");
...
<span>Текст до.</span>
<div id="container">Сейчас появится текст:<div>
<span>И текст после</span>

Автор: Sattu 3.5.2004, 16:26
Большое тебе, Sardar, человеческое спасибо за очень толковый ответ.

Но, к сожалению, я не обьяснил зачем мне это нужно - и ты пошел по ложному пути. Сорри..

Мне это нужно не для HTML, а для XUL (eXtensible User interface Language). На этом "диалекте" XML "пишут" интерфейсы плагинов для Mozill'ы и не только.

Я пишу клиент для сервера чатов. Он общается с сервером через сокет с помощью XML-based протокола. Так вот, между посылкой некоторых пакетов нужно делать паузы в несколько секунд. И тут я застрял, никак не могу более-менее реализовать эту паузу sad.gif

Очень нужно чтобы функции выполнялись в строгом порядке до и после паузы. Тоесть чтобы, например, в твоем последнем коде alert() выполнялся после последнего utimer(). Возможно ли вообще такое реализовать на JavaScript?

Еще раз спасибо за предыдущий ответ.



Автор: Sardar 3.5.2004, 18:31
>Так вот, между посылкой некоторых пакетов нужно делать паузы в несколько секунд.
Зачем это для чат-клиента...?

Возможно обьект через который ты общаешся с сервером имеет встроенные функции для задержки времени. У xulplanet.com траблы с хостингом, я до справочника не добрался.

По любому уснуть как в С, так что бы кнопки перестали реагировать не получится, и это правильно ИМXО.

Я думаю что с очередью все получится, ставим отправку пакетов в очередь с задержкой, а последним действием возобновляем выполнение программы. Таймер работает паралельным процессом, т.е. код повешанный на события продолжает исполняться, так что по кнопке "прервать" можно легко очистить очередь.'

Подробней опиши задачу, когда и зачем отправляем пакеты, через какие обьекты, как принимается ответ сервера(событие, опрашиваем обьект...) и т.п. Как-нибудь разберемся smile.gif

Автор: Sattu 5.5.2004, 11:43
Цитата
По любому уснуть как в С, так что бы кнопки перестали реагировать не получится, и это правильно ИМXО.

Да мне и не надо чтобы кнопки не реагировали, просто чтобы скрипт (а не браузер) "засыпал".

Цитата
Я думаю что с очередью все получится, ставим отправку пакетов в очередь с задержкой, а последним действием возобновляем выполнение программы. Таймер работает паралельным процессом, т.е. код повешанный на события продолжает исполняться, так что по кнопке "прервать" можно легко очистить очередь.'

Ты прав, по видимому придется использовать очереди.

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

Я использую библиотеку http://jslib.mozdev.org, вернее только один ее скрипт socket.js. Он разрешает делать базовые операции с сокетом (open, read, write, close).

Перестрою принцып работы клиента - и думаю, что всеже удастся обойти паузу. Я просто не очень опытен в JavaScript'е, и иногда пытаюсь решить задачу "в лоб". Но JavaScript требует особого подхода и мышления, к котому, я надеюсь, довольно скоро привыкну smile.gif.

Автор: Sardar 5.5.2004, 15:36
Цитата
Я использую библиотеку JSLib, вернее только один ее скрипт socket.js

По сути socket.sj оболочка это оболочка для SocketService. Класс юзает только входящий и исходящий поток(метод open), если покопатся в nsISocketTransportService, может там есть функции time-out'а.
Но все же логику работы лучше продумать smile.gif

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