вопросы.
Мне нужно выполнять функцию 5 раз с промежутком в 3 секунды, но в некоторых случаях нужно прекращать выполнение функции досрочно.
Казалось бы, всё просто: делать через таймер, получить идентификатор таймера:
let timerId = setTimeout(...);
И в нужный момент отменить:
clearTimeout(timerId);
Но возникает другой вопрос: допустим, мне нужно сделать 100 таких таймеров. Как быть в этой ситуации?
Если это поможет, в вызываемую функцию передаётся уникальный ID. Можно ли отменить по этому ID?
А что за задача такая где тебе нужно 100 таймеров? Звучит так будто ты делаешь что-то не правильно
Делаешь переменную счетчика, когда выполняется сет интервал, плюсуешь его, когда понимаешь что уже кирдык то очищаешь)
эй, это был мой вопрос :)
Ну смотри вполне ок кейс, нужна пять раз что-то делать а на 6 раз останавливать это)
тогда я не понял вопро
Не очень понятно, что за 100 таймеров. Но навскидку, можешь сделать функцию. Ты передаешь туда callback и время, она регистрирует таймаут или интервал и возвращает ID. По этому ID можешь останавливать. Если тебе нужно не останавливать, а именно в конкретный момент не выполнять функцию, можешь завести флаг-условие, а внутри функции проверять этот флаг. Или передавать ссылку на этот флаг в функцию-фабрику, и оборачивать callback в условие проверки этого флага
Мессенджер, отправляющий сообщения (и сообщения о доставке) в радиоэфир. Сейчас всё работает, но иногда (помехи, отдалённость и т.д) репитер сообщение не видит. В этой ситуации выход такой: отправлять сообщение (либо сообщение о доставке) 5 раз, но как только репитер сообщение подхватил, отменять. То есть, смотрите, отправил я "Привет", "как дела" и следом "что делаешь?" пользователю. Первое репитер подхватил (таймер повтора отменяется), второе и третье - нет (нужно повторить). Повторяем второе и третье, второе сообщение "ушло", осталось третье - повторяем его отправку снова. А теперь представьте, что в это же самое время нам приходит 5 сообщений и на все нужно отправить сообщение "доставлено".
И сколько таких переменных делать? Как потом в них не запутаться?
У меня идея такая: независимо ни от чего вызывать функцию каждые 2 секунды, а функция уже пусть смотрит, есть ли в очереди сообщения. То есть, нужно каждое сообщение добавлять в очередь и точно так же убирать из очереди.
А не проще простой очередью воспользоваться?
Вот до этого я и дошёл. Вопрос - как очередь сделать?
по такому же принципу работает сушка в уборных кажется нажал +1 к счетчику а каждую Н-секунду он уменьшается
Только придется определиться с алгоритмом, ФИФО или ЛИФО
function time(run) { if(!run) return; // … some actions } setInterval(time, 2000);
Это мягко говоря совсем не очередь
в целом да, но если ему нужно прерывать действия в функции то как вариант можно использовать
Ты можешь и очередь остановить/очистмть
Умя был синьор так он делал все одним таймером!! Точнее одной анимацией) если кадр пропустить то ставил условие)) какая разница что кадры читаются в пустую)))
Таймеры вообще бэд практис, скорее всего твою задачу можно решить без них
Ничего не понял. У меня 10 сообщений, каждое надо по 5 раз отправить.
Ну так запихай их в очереди)
Обсуждают сегодня