setInterval() в JavaScript — это метод глобального объекта, позволяющий выполнять код или вызывать функцию регулярно с заданным интервалом. Интервальное время задается в миллисекундах, а остановить выполнение кода можно с помощью clearInterval().
setInterval(() => {
console.log('Прошло 2 секунды')
}, 2000)
Стоит отметить, что первое сообщение будет выведено в console только через 2 секунды, после начала работы метода, а не немедленно.
Функция в setInterval() может бысть стрелочной, анонимной, именованной, методом объекта или конструктором, а также строкой (что не рекомендуется).
Анонимная
setInterval(function() {
console.log('Прошло 2 секунды')
}, 2000)
Именованная
setInterval(printMessage, 2000)
function printMessage() {
console.log('Прошло 2 секунды')
}
Записывая имя функции в setInterval() помните, что скобки в данном случае пропускаются.
Интервал времени в setInterval() задается в миллисекундах. Если задача - исполнять код каждую секунду, пишем 1000, если каждую минуту - тогда 60000. Можно также установить 0 или даже пропустить этот аргумент. В этом случае метод будет стараться исполнить код как можно чаще, но на практике интервал зависит от ряда факторов, таких как реализация JavaScript и загрузка системы. Если грубо, ориентироваться можно на 4 -10 миллисекунд.
Максимальное же значение, которое можно задать в setInterval() составляет 2147483647 миллисекунд, это около 24.85 дней.
Помимо прочего, работая с setInterval(), стоит помнить, что вызов функции может происходить не через четко заданное время - выполнение может задерживаться из-за различных факторов, таких как загрузка процессора и другие задачи в очереди.
setInterval(function() {
console.log('Прошло 2 секунды')
}, 2000)
for (let i = 0; i <= 50000; i++) {
console.log(i)
}
В данном примере вывод в console сообщения Прошло 2 секунды мы увидим только после того, как отработает цикл for. Хотя интерпретатор зарегистрирует задачу с setInterval() и начнет отсчет, выполнение кода мы не увидим, так как поток будет занят выводом в console чисел от 0 до 50000. После того как работа цикла завершится, мы сразу же увидим работу setInterval().
Если вкладка не активна продолжительное время, современные браузеры замедляют или даже прекращают выполнение JavaScript, в этом случае работа setInterval() может быть существенно замедлена или даже приостановлена.
Возможна ситуация, при которой функция в setInterval() отрабатывает дольше, чем промежуток между её вызовами. В этом случае вызовы функции будут накапливаться, и код будет исполняться без задержек. В такой ситуации одним из решений может служить использование setTimeout(), где отсчет можно начинать только после того, как необходимая нам функция выполнится.
setTimeout(print, 2000)
function print() {
console.log('Прошло 2 секунды')
setTimeout(print, 2000)
}
В функцию, вызываемую через setInterval(), можно передать аргументы напрямую через метод. В таком случае, все параметры, идущие после задержки в миллисекундах, будут переданы этой функции.
let startMessage = 'Прошло'
let endMessage = '2 секунды'
setInterval(printMessage, 2000, startMessage, endMessage)
function printMessage(message1, message2) {
console.log(`${message1} ${message2}`)
}
Используя анонимную функцию.
setInterval(function() {
printMessage(startMessage, endMessage)
}, 2000)
Тоже сработает.
setInterval(function(message1, message2) {
console.log(`${message1} ${message2}`)
}, 2000, startMessage, endMessage)
Или стрелочную
setInterval(() => printMessage(startMessage, endMessage), 2000)
Для того, чтобы отменить интервальный вызов функции, установленный с помощью setInterval(), используют функцию clearInterval().
let timerId = setInterval(() => {
console.log('Прошло 2 секунды')
}, 2000)
setTimeout(() => {
clearInterval(timerId)
console.log('Сработал clearInterval')
}, 6000)
console.log(timerId) // 1
Для начала в переменную записываем уникальный идентификатор, который возвращает функция setInterval(). Эту переменную затем используем в clearInterval(). Чтобы задать временную задержку перед остановкой интервального выполнения кода, добавляем setTimeout(). Для наглядности можно выводить значение уникального идентификатора. В нашем примере это будет 1
Стоит заметить, что идентификатор, возвращаемый setInterval(), не всегда будет равен 1. Это зависит от того, сколько других таймеров и интервалов было создано до этого.
Рассмотрим, как контекст this ведет себя при работе с setInterval() в разных ситуациях.
Именованная функция
function message() {
console.log(this)
}
setInterval(message, 1000) // Window
this в именованной функции, вызываемой в setInterval(), ссылается на глобальный объект window в браузерах и на global в Node.js.
Метод объекта
const obj = {
message: 'Прошла секунда',
printMessage: function message() {
console.log(`Сообщение: ${this.message}`)
}
}
setInterval(obj.printMessage, 1000) // Сообщение: undefined
console.log(window.message) // undefined
В методе объекта, вызванного через setInterval, this также будет ссылаться на глобальный объект window. Поэтому в нашем случае мы получим undefined, то же самое, что и при window.message.
Стрелочная функция
const obj = {
message: 'Прошла секунда',
printMessage: function message() {
setInterval(() => {
console.log(`Сообщение: ${this.message}`)
}, 1000)
}
}
obj.printMessage() // Сообщение: Прошла секунда
Стрелочные функции наследуют контекст из окружающей среды, в итоге мы получаем желаемый результат.
bind
Можно задать контекст выполнения явно.
const obj = {
message: 'Прошла секунда',
printMessage: function message() {
console.log(`Сообщение: ${this.message}`)
}
}
setInterval(obj.printMessage.bind(obj), 1000) // Сообщение: Прошла секунда
Анонимная функция
Также, получить желаемый контекст можно, обернув вызов в анонимную функцию.
const obj = {
message: 'Прошла секунда',
printMessage: function message() {
console.log(`Сообщение: ${this.message}`)
}
}
setInterval(function() {
obj.printMessage()
}, 1000) // Сообщение: Прошла секунда