Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.33.153] |
|
Сообщ.
#1
,
|
|
|
Здрасте, немного отойду от предыдущей темы
Вот код: function invoke(fn, start, interval, end) { if (arguments.length <= 2) { // однократный вызов fn setTimeout(fn, start); } else { // многократный вызов fn setTimeout(function () { var h = setInterval(fn, interval); if (end) { setTimeout(function() { clearInterval(h); }, end); } }, start); } } function foo(){ console.log('foo'); } invoke(foo, 0, 100, 5000); // выполняется вызов foo в течении 5 секунд но как остановить вызовы, если не задан параметр end? invoke(foo, 0, 100); // этот код будет выполнятся бесконечно или пока не перезагрузишь страницу пробую получить значение h, чтобы потом иметь возможность вызвать clearInterval(h), но как его получить? |
Сообщ.
#2
,
|
|
|
сам порешал
function invoke(fn, start, interval, end) { var ret = { timerId: null }; //<-- заводим объект, в которым возратим наш id таймера if (arguments.length <= 2) { setTimeout(fn, start); } else { setTimeout(function (o) { o.timerId = setInterval(fn, interval); //<-- запоминаем if (end) { setTimeout(function() { clearInterval(o.timerId); }, end); } }, start, ret); } return ret; //<-- возвращаем } var o = invoke(foo, 10000, 1000); clearInterval(o.timerId); //<-- теперь можем остановить Гениально да? |
Сообщ.
#3
,
|
|
|
продолжаем выпендриваться
<html> <head> </head> <body> <button onclick="clearInterval( this.Cfon.timerId );">STOP</button> <div id="test">TEST</div> <script> function invoke( fn, start, interval, end, ret ) { ret = ret || { timerId: null }; ret.timerId = setTimeout( function( ) { if ( interval ) ret.timerId = setInterval( fn, interval ); fn( ); }, start ); if ( end ) setTimeout( function( ) { clearInterval( ret.timerId ) }, end ); } invoke( function( ) { document.getElementById( 'test' ).innerHTML += ( ' - ' + Math.random() ); ; }, 5000, 300, 30000, document.getElementsByTagName('button')[ 0 ].Cfon = { timerId: null } ); </script> </body> </html> |
Сообщ.
#4
,
|
|
|
Цитата K313 @ продолжаем выпендриваться Фигово ты умеешь это делать, однако: https://jsbin.com/katevefato/3/edit?html,js,output Добавлено По ссылке следующий код, кому влом открывать и смотреть: <!DOCTYPE html> <html> <head> <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script> </head> <body> <button data-bind="click: toggle"> Жмакни меня! <b data-bind="text: i"></b> </button> </body> </html> class Test i: ko.observable 0 start: => @allows = setInterval => @i (do @i) + 1, 100 stop: => clearInterval(@allows) or @allows = null toggle: => if @allows? then do @stop else do @start ko.applyBindings new Test, document.body |
Сообщ.
#5
,
|
|
|
Цитата Serafim @ да да, конечно, а сам привязал слона к ножке стула и... Фигово ты умеешь это делать, однако: |
Сообщ.
#6
,
|
|
|
Цитата K313 @ да да, конечно, а сам привязал слона к ножке стула и.. и сделал всё 6ю строчками |
Сообщ.
#7
,
|
|
|
Цитата K313 @ продолжаем выпендриваться первое, твой код не работает, если не указать параметр end: invoke( function( ) { document.getElementById( 'test' ).innerHTML += ( ' - ' + Math.random() ); ; }, 5000, 300/*, 30000, document.getElementsByTagName('button')[ 0 ].Cfon = { timerId: null } */); я же вначале писал, если не указывать последний параметр, то как остановить? второе, я не приветствую указание кода в обработчиках в виде строки <button onclick="clearInterval( this.Cfon.timerId );">STOP</button> Добавлено Цитата Serafim @ и сделал всё 6ю строчками сори даже не проверял, ибо не разбираюсь в этом наборе значков понимаю что сильно отстал от жизни, но как бэ щас вопрос в другом был Добавлено а теперь правильный вариант function invoke(fn, start, interval, end) { var timerId; //<-- простая переменная, убираем объект, не надо больше возвращать ничего if (arguments.length <= 2) { setTimeout(fn, start); } else { setTimeout(function () { timerId = setInterval(fn, interval); //<-- запоминаем id if (end) { setTimeout(function() { clearInterval(timerId); }, end); } }, start); } // тут внимание! супер-пупер гениальное рещение! ))) // определяем замыкание на timerId invoke.stop = function(){ clearInterval(timerId); }; } invoke(foo, 5000, 1000); invoke.stop(); Гениально! Читайте книжки дети! |
Сообщ.
#8
,
|
|
|
Цитата Cfon @ если не указан - значит и останавливать не нужнопервое, твой код не работает, если не указать параметр end: Цитата Cfon @ ну поменяй параметры местамия же вначале писал, если не указывать последний параметр, то как остановить? function invoke( fn, start, interval, ret, end ) Цитата Cfon @ это не суть, не хочешь - не указывай. Прикрепи слушатель событий или ещё чё. Хранить объект для останова можно где угодно и как угодно, создал глобальную переменную и управляешь, например второе, я не приветствую указание кода в обработчиках в виде строки var stop_1 = { timerId : null }; invoke( func, 5000, 300, stop_1 ); Цитата Cfon @ ты хоть заметил, что в моём варианте можно не только setInterval остановить, но и само начало его запуска, то есть остановить запуск setTimeout. Кроме того, если у тебя задан interval, то первый запуск функции будет не через start милисекунд, как это происходит если параметр interval не задан, а через start + interval милисекунд (то есть у тебя разное поведение)а теперь правильный вариант Короче у меня код и в три строчки, и с правильным запуском, и с правильным управлением. А твой ... Цитата Cfon @ Гениально! invoke(foo, 5000, 1000); invoke(foo, 5000, 1000); invoke.stop(); |
Сообщ.
#9
,
|
|
|
Цитата K313 @ ну поменяй параметры местами function invoke( fn, start, interval, ret, end ) это что за гавнокод? Цитата K313 @ Цитата Cfon @ это не суть, не хочешь - не указывай. Прикрепи слушатель событий или ещё чё.второе, я не приветствую указание кода в обработчиках в виде строки именно суть, ибо по тому как написан код я делаю вывод смотреть его или нет, например вижу такое г меня сразу Цитата K313 @ Кроме того, если у тебя задан interval, то первый запуск функции будет не через start милисекунд, как это происходит если параметр interval не задан, а через start + interval милисекунд (то есть у тебя разное поведение) есть такое дело, но вопрос изначально был как остановить Цитата K313 @ Короче у меня код и в три строчки, и с правильным запуском, и с правильным управлением. А твой ... то что ты записал код в три строки не значит, что твой код в три строчки. вот как записывают я (нормальные программеры ), упс уже не три строчки function invoke( fn, start, interval, end, ret ){ ret = ret || { timerId: null }; ret.timerId = setTimeout( function() { if ( interval ) { ret.timerId = setInterval( fn, interval ); } fn(); }, start ); if ( end ){ setTimeout( function( ) { clearInterval( ret.timerId ) }, end ); } } Цитата K313 @ invoke(foo, 5000, 1000); invoke(foo, 5000, 1000); invoke.stop(); другое гениальное решение! function makeInvoker() { var timerId; function invoke(fn, start, interval, end){ if (arguments.length <= 2) { setTimeout(fn, start); } else { timerId = setTimeout(function tick() { fn(); timerId = setTimeout(tick, interval); //<-- рекурсивный вызов }, start); if (end) { setTimeout(function() { clearInterval(timerId); }, end); } } } invoke.stop = function(){ clearTimeout(timerId); }; return invoke; } var invoke1 = makeInvoker(), invoke2 = makeInvoker(); invoke1(foo, 1000, 1000); invoke2(foo, 3000, 1000); invoke1.stop(); invoker2.stop(); пс. пофиксил косяк с вызовом invoke.stop() и предыдущий косяк с setInterval, через рекурсивный setTimeout. |
Сообщ.
#10
,
|
|
|
ну всё, понеслось...
|
Сообщ.
#11
,
|
|
|
Может забанить на всякий случай?
Добавлено Цитата Cfon @ сори даже не проверял, ибо не разбираюсь в этом наборе значков понимаю что сильно отстал от жизни, но как бэ щас вопрос в другом был Если бы ты пример посмотрел - увидел бы что всё и стартуется и останавливается идеально |