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


Автор: Alx 30.9.2007, 17:52
опять меня клинит.. целый день сегодня вешаюсь на одной задаче...

есть функция, которая вызвывает себя рекурсивно по таймауту.при нажатии кнопки надо остановить вызовы, вызвать её моментально без задержки, а затем продолжить снова, через одну секунду.
т.е. вот так:
-  -  -  -  --  -  -  -
              ^
в этом месте была нажата кнопка.

нужно использовать именно setTimeout, с setInterval у меня уже получилось, но мне это не подходит..

за целый день уже кучу раз испробывал вариации одного кода:

Код

<script>

window.sending = 0; // счетчик нажатий кнопки

function s()
{   window.sending++; g(true); // вызов по кнопке, считаем вызовы
}
function g(s)
{   s = s || false; // s - вызов по кнопке, !s - вызов по таймауту
    if(window.sending>0 && !s) return; // если функция вызвала сама себя, продолжаем только, если кнопку никто не нажимал
    document.getElementById('bar').innerHTML += " "+s+" "; // просто индикатор вызовов функции
    if(window.sending>0 && s) window.sending--; // конец функции. уменьшаем sending, если вызов был по кнопке
    if(window.sending == 0) setTimeout(function() {g();}, 500); // делаем запрос только если sending = 0 (все вызовы по кнопке прошли)
}

onload=g; 
</script>
<div id="bar">&nbsp;</div>
<br/>
<input type="button" onclick="s();" value="send">


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

Автор: Alx 30.9.2007, 18:07
о. ура. вроде получилось. как все-таки благоприятно действует форум smile
Код

window.sending = 0; // счетчик нажатий кнопки

function s()
{   window.sending++; g(true); // вызов по кнопке, считаем вызовы
}
function g(s)
{   s = s || false; // s - вызов по кнопке, !s - вызов по таймауту
    if(window.sending>0 && !s) return; // если функция вызвала сама себя, продолжаем только, если кнопку никто не нажимал
    document.getElementById('bar').innerHTML += " "+s+" "; // просто индикатор вызовов функции
     // конец функции. уменьшаем sending, если вызов был по кнопке
    if(window.sending == 1 && s || window.sending == 0)
    setTimeout(function() {
       if(window.sending>0 && s) window.sending = 0;
       g();
    }, 1000);
}

onload=g; 


теперь правда все равно при многократном нажатии кнопки влезают таки ненужные запросы по таймауту. но зато сами таймауты больше не плодятся. а это главное. всем спасибо)

 smile 

Автор: SelenIT 30.9.2007, 18:07
Сорри если не в тему, но... разве нельзя хранить идентификатор последнего вызванного таймаута в статической/глобальной переменной и по нажатию кнопки просто делать ему clearTimeout?

Автор: Alx 30.9.2007, 20:15
что?.. я даже не подразумевал у существовании clearTimeout...

Автор: Alx 30.9.2007, 22:24
вот называется - живи и удивляйся smile
(у меня в книжке было только setTimeout, setInterval и clearInterval...  smile )

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