Если у меня есть активный тайм-аут, который был установлен var t = setTimeout("dosomething()", 5000)
,
Есть ли способ приостановить и возобновить его?
Есть ли способ узнать время, оставшееся до текущего тайм-аута?
или мне нужно в переменной, когда установлен тайм-аут, сохранить текущее время, затем мы делаем паузу, получаем разницу между сейчас и потом?
javascript
timeout
Hailwood
источник
источник
Ответы:
Вы можете обернуть
window.setTimeout
это так, что, я думаю, похоже на то, что вы предлагали в вопросе:источник
setTimeout()
не работает в Internet Explorer <= 9.timer.resume(); timer.resume();
вас будет два таймаута одновременно. Вот почему вам нужно либоclearTimeout(timerId)
сначала выполнитьif (timerId) return;
короткое замыкание, либо сделать короткое замыкание в самом начале резюме.var timerId, start, remaining;
за пределы области класса и добавитьremaining = delay;
обратно внутрь, чтобы поймать параметр. Работает как шарм!if (blah) { ... }
) или что-то в этом роде?Что-то вроде этого должно помочь.
источник
+new Date()
на,new Date().getTime()
поскольку он быстрее: jsperf.com/date-vs-gettimeНет. Вам нужно отменить его (
clearTimeout
), измерить время с момента его запуска и перезапустить с новым временем.источник
Слегка измененная версия ответа Тима Даунса . Однако, поскольку Тим откатил мою правку, я должен ответить на это сам. Мое решение позволяет использовать extra в
arguments
качестве третьего (3, 4, 5 ...) параметра и очистить таймер:Как упоминал Тим, дополнительные параметры недоступны в
IE lt 9
, однако я немного поработал, чтобы они работали вoldIE
.Использование:
new Timer(Function, Number, arg1, arg2, arg3...)
источник
«Пауза» и «возобновление» на самом деле не имеют особого смысла в контексте
setTimeout
, который является одноразовым . Вы имеете в видуsetInterval
? Если да, то нет, вы не можете приостановить его, вы можете только отменить его (clearInterval
), а затем заново запланировать его. Подробная информация обо всем этом в разделе « Таймеры» спецификации.источник
Для тайм-аута было достаточно легко найти решение, но с интервалом было немного сложнее.
Для решения этой проблемы я придумал следующие два класса:
Их можно реализовать как таковые:
В этом примере будет установлен тайм-аут паузы (pt_hey), который по расписанию будет предупреждать "эй" через две секунды. Другой тайм-аут приостанавливает pt_hey через одну секунду. Третий тайм-аут возобновляет pt_hey через две секунды. pt_hey запускается в течение одной секунды, останавливается на одну секунду, затем возобновляет работу. pt_hey срабатывает через три секунды.
Теперь о более сложных интервалах
В этом примере задается интервал паузы (pi_hey) для записи «hello world» в консоль каждые две секунды. Таймаут приостанавливает работу pi_hey через пять секунд. Другой тайм-аут возобновляет pi_hey через шесть секунд. Таким образом, pi_hey сработает дважды, запустится в течение одной секунды, остановится на одну секунду, запустится в течение одной секунды, а затем продолжит запуск каждые 2 секунды.
ДРУГИЕ ФУНКЦИИ
clearTimeout () и clearInterval ()
pt_hey.clearTimeout();
иpi_hey.clearInterval();
служат простым способом сбросить таймауты и интервалы.getTimeLeft ()
pt_hey.getTimeLeft();
иpi_hey.getTimeLeft();
вернет, сколько миллисекунд до запланированного срабатывания следующего триггера.источник
setInterval
? Я думаю, что простоеif(!true) return;
поможет, или я ошибаюсь?Мне нужно было рассчитать прошедшее и оставшееся время, чтобы показать индикатор выполнения. Использовать принятый ответ было непросто. 'setInterval' лучше, чем 'setTimeout' для этой задачи. Итак, я создал этот класс Timer, который вы можете использовать в любом проекте.
https://jsfiddle.net/ashraffayad/t0mmv853/
источник
/ оживить
Версия ES6 с использованием синтаксического сахара класса y 💋
(немного изменено: добавлен start ())
источник
Вы можете посмотреть clearTimeout ()
или пауза в зависимости от глобальной переменной, которая устанавливается при выполнении определенного условия. Вроде кнопка нажата.
источник
Вы также можете реализовать это с помощью событий.
Вместо того, чтобы вычислять разницу во времени, вы запускаете и прекращаете прослушивание события «тик», которое продолжает работать в фоновом режиме:
источник
Если вы все равно используете jquery, посмотрите $ .doTimeout плагин . Это огромное улучшение по сравнению с setTimeout, включая возможность отслеживать тайм-ауты с помощью одного указанного вами строкового идентификатора, который не меняется каждый раз, когда вы его устанавливаете, и реализует простую отмену, циклы опроса и устранение неполадок, а также Больше. Один из моих наиболее часто используемых плагинов jquery.
К сожалению, он не поддерживает паузу / возобновление прямо из коробки. Для этого вам нужно будет обернуть или расширить $ .doTimeout, предположительно аналогично принятому ответу.
источник
Мне нужно было приостановить setTimeout () для функции, подобной слайд-шоу.
Вот моя собственная реализация таймера с приостановкой. Он объединяет комментарии, замеченные в ответе Тима Дауна, такие как лучшая пауза (комментарий ядра) и форма прототипирования (комментарий Умура Гедика).
Пример:
Чтобы протестировать код, используйте
timer.resume()
иtimer.pause()
несколько раз и проверьте, сколько времени осталось. (Убедитесь, что ваша консоль открыта.)Использовать этот объект вместо setTimeout () так же просто, как заменить его
timerID = setTimeout( mycallback, 1000)
наtimer = new Timer( mycallback, 1000 )
. Тогдаtimer.pause()
иtimer.resume()
вам доступны.источник
"async" рабочая демонстрация на сайте zarsoft.info
источник
Реализация машинописного текста на основе самого популярного ответа
источник
Вы можете сделать, как показано ниже, чтобы сделать setTimeout приостановленным на стороне сервера (Node.js)
и вы можете проверить это, как показано ниже
источник
Не думаю, что вы найдете что-то лучше, чем clearTimeout . В любом случае, вы всегда можете запланировать следующий тайм-аут позже, а не «возобновить» его.
источник
Если вам нужно скрыть несколько div, вы можете использовать
setInterval
и несколько циклов, как в:источник