popov . dev

Главная

Библиотека

Статьи

Таймеры и интерв...

Таймеры и интервалы в JavaScript

В JavaScript существует несколько способов выполнения обычной задачи планирования вызова на более поздний срок. Двумя наиболее часто используемыми методами выполнения кода с определенными интервалами являются:

  • setInterval() запускает функцию повторно, начиная с определенного интервала времени и непрерывно повторяя его через этот интервал
  • setTimeout() запускает функцию один раз через определенный промежуток времени

setInterval()

Метод setInterval() в интерфейсе Window повторно вызывает функцию или выполняет фрагмент кода с фиксированной временной задержкой между каждым вызовом. Синтаксис следующий:

setInterval(functionRef, milliseconds, arg1, arg2);

Рассмотрим параметры метода:

  • functionRef - функция обратного вызова, содержащая блок кода
  • milliseconds - временной интервал между выполнением функции (1 секунда = 1000 миллисекунд)
  • arg1, arg2 являются необязательными аргументами для функции

Этот метод возвращает interval ID, который идентифицирует этот конкретный интервал, и вы можете удалить его позже, вызвав clearInterval(intervalID).

Пример 1

function displayGreeting() {
    console.log("Привет")
}

// Выводит приветствие каждые 3 секунды
setInterval(displayGreeting, 3000);

Пример 2

// выводит местное время каждую секунду
setInterval(myTimer, 1000);

function myTimer() {
    const date = new Date();
    document.getElementById('time').innerHTML = date.toLocaleTimeString();
}

// new Date() получает текущие дату и время
// toLocaleTimeString() возвращает текущее время

Обратите внимание, что мы передаем функцию в setInterval, но не запускаем ее. Распространенной ошибкой является добавление скобок () после имени функции. Это не сработает, потому что setInterval ожидает ссылку на функцию.

clearInterval

Мы используем clearInterval(intervalID) для отмены интервала.

const intervalID = setInterval(displayGreeting, 3000); 

// можно остановить выполнение вызовом clearInterval()
clearInterval(intervalID)

setTimeout

Чтобы выполнить функцию только один раз, используйте вместо этого метод setTimeout().

setTimeout() - это метод, который устанавливает таймер, который выполняет функцию или указанный фрагмент кода по истечении таймера. Он задерживает выполнение функции обратного вызова.

Мы даем функции setTimeout() два аргумента: функцию обратного вызова и время задержки.

// задержка вывода приветствия на 3 секунды
setTimeout(displayGreeting, 3000);

Вы также можете передать анонимную функцию в setTimeout и setInterval:

setTimeout(() => { alert('Привет!') }, 2000);

Указания по использованию

Вот несколько примеров того, где интервалы (setInterval) могут пригодиться:

  • для отображения обратного отсчета по таймеру
  • чтобы создать динамический индикатор выполнения
  • для переключения между двумя цветами фона
  • для создания анимации с пульсирующим эффектом

Вот простой пример реализации таймера:

HTML

 <div id="timer"></div>

JavaScript

const timer = document.getElementById('timer');
let currentTime = 10;

function countDown() {
    currentTime--
    timer.textContent = currentTime

    if (currentTime === 0 ) {
        clearInterval(timerID)
        alert('Игра окончена!')
    }
}

let timerID = setInterval(countDown, 1000)

Функция, вызываемая только один раз после задержки (setTimeout), является обычной задачей, если вы хотите, например, отобразить модальный режим после того, как посетитель просматривал вашу страницу в течение определенного периода времени, или сообщение через несколько секунд после загрузки страницы, или если вы хотите, чтобы короткое время отображалось в режиме реального времени. задержитесь перед удалением эффекта наведения курсора мыши с элемента.

В следующем примере показано сообщение, отображаемое через две секунды после загрузки страницы:

const msg = document.getElementById('msg')

setTimeout(showMsg, 2000)

function showMsg() {
     msg.textContent = 'Привет мир'
}

requestAnimationFrame

Хорошо, мы рассмотрели, как выполнять функцию с определенным интервалом с помощью setInterval(), как очистить интервал с помощью clearInterval(), а также использование setTimeout(), которое мы можем использовать для задержки выполнения функции и запуска ее только один раз. Еще один метод, о котором стоит упомянуть в этой теме, - это метод requestAnimationFrame(), который позволяет выполнять код при перерисовке следующего доступного экрана. Это особенно полезно при использовании JavaScript для анимации и повторных обновлений пользовательского интерфейса. Поскольку это зависит от времени перерисовки в браузере, эффект получается более плавным, чем при использовании функции setInterval().

Например, requestAnimationFrame(myFinction) вызовет myFunction перед следующей перерисовкой. Этот метод возвращает идентификатор, и обратный вызов можно отменить, вызвав cancelAnimationFrame(animationFrameID).

При создании анимации мы должны отдавать предпочтение requestAnimationFrame, а не использованию setTimeout, поскольку он будет срабатывать примерно шестьдесят раз в секунду, в отличие от setTimeout, который вызывается через n миллисекунд. Используя requestAnimationFrame, мы можем избежать повторного изменения чего-либо между двумя обновлениями фрейма и добиться более плавного эффекта, позволяя браузеру выполнять оптимизацию и останавливать анимацию в неактивных вкладках. Подробнее о requestAnimationFrame читайте здесь.

Комментарии

Для того чтобы оставить свое мнение, необходимо зарегистрироваться на сайте