@ololodff

Как правильно объединить две js функции в одну?

var sec = $('.rocket');
		var secVal = 5;
		function timer(){
			var timer = setTimeout(function tick() {
				if (secVal > 0) {
				    sec.text(--secVal);
				    timer = setTimeout(tick, 1000);
				} else {
				   	sec.text('text');
				}
			}, 1000);
		}
	    fancybox.on("done", (fancybox, slide) => {
	    	timer();
	   })


Есть функция обратного отсчета(таймер). Он начинает работать как только окно всплывающее открывается.
Проблема заключается в том, что таймер при повторном открытии этого же окна не сбрасывается и получается так что один таймер накладывается на второй и тд и по итогу получается каша. Как это исправить?
  • Вопрос задан
  • 138 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Перед запуском таймера проверять его состояние. Если таймер уже запущен и ещё не завершился, то либо завершать предыдущий и инициализировать новый, либо пропускать инициализацию.
let timer = null;
...
if (timer !== null) {
  timer = setTimeout(
    () => {
      timer = null;
      ...
    },
    1000
  );
}
Ответ написан
@GrayHorse
Неужели это не лучше?
async function timer() {
  let countdown = 5;
  while (countdown--) {
    console.log(countdown + 1);
    await sleep(1000);
  };
  console.log("done");
}
function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}


С отменой на повторном вызове:
let execId = 0;
async function timer() {
  let countdown = 5;
  const id = ++execId;
  while (countdown--) {
    if (id !== execId) {
      return;
    }
    console.log(countdown + 1);
    await sleep(1000);
  };
  console.log("done");
}
function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}
Ответ написан
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы