Запустить функцию setInterval без задержки при первом выполнении
Как настроить метод setInterval
в JavaScript так, чтобы он выполнял функцию немедленно, а затем продолжал выполнять её с заданным интервалом?
5 ответ(ов)
Наиболее простым решением в данной ситуации будет просто вызвать функцию foo
напрямую в первый раз:
foo();
setInterval(foo, delay);
Однако есть веские причины избегать использования setInterval
. В частности, в некоторых случаях сразу может произойти множество событий setInterval
без необходимой задержки. Еще одна причина заключается в том, что если вы захотите остановить цикл, вам нужно будет явно вызвать clearInterval
, что означает, что вам придется запомнить идентификатор, возвращаемый из первоначального вызова setInterval
.
Альтернативным методом является использование setTimeout
, чтобы foo
вызывала саму себя для последующих вызовов:
function foo() {
// выполняем действия
// ...
// и запланируем повторный вызов
setTimeout(foo, delay);
}
// запускаем цикл
foo();
Этот подход гарантирует, что между вызовами будет как минимум задержка равная delay
. Кроме того, он упрощает задачу остановки цикла — вам просто не нужно будет вызывать setTimeout
, когда ваша условие окончания цикла достигнуто.
Более того, вы можете обернуть это все в незамедлительно вызываемое функциональное выражение (IIFE), которое создаст функцию и сразу же вызовет её, таким образом начиная цикл:
(function foo() {
// код
...
setTimeout(foo, delay);
})();
Это определяет функцию и запускает цикл в одном шаге.
Я не уверен, что правильно вас понял, но вы можете сделать что-то вроде этого:
setInterval(function hello() {
console.log('мир');
return hello;
}(), 5000);
Разумеется, существует множество способов сделать это, но это самый краткий из тех, что я могу предложить.
Я наткнулся на этот вопрос по той же причине, и ни одно из предложенных решений не помогает, если вам нужно вести себя точно так же, как setInterval()
, но с единственным отличием, что функция вызывается немедленно в начале.
Вот моё решение этой проблемы:
function setIntervalImmediately(func, interval) {
func();
return setInterval(func, interval);
}
Преимущества данного решения:
- Существующий код, использующий
setInterval
, можно легко адаптировать путём замены. - Работает в строгом режиме.
- Работает с уже существующими именованными функциями и замыканиями.
- Вы можете продолжать использовать возвращаемое значение и передавать его в
clearInterval()
позже.
Пример:
// создаем интервал в 1 секунду с немедленным выполнением
var myInterval = setIntervalImmediately( _ => {
console.log('hello');
}, 1000);
// очищаем интервал через 4.5 секунды
setTimeout( _ => {
clearInterval(myInterval);
}, 4500);
Если быть немного дерзким, если вам действительно нужно использовать setInterval
, то вы также можете заменить оригинальный setInterval
. Таким образом, изменения в коде не понадобятся, если добавить это перед вашим существующим кодом:
var setIntervalOrig = setInterval;
setInterval = function(func, interval) {
func();
return setIntervalOrig(func, interval);
}
Тем не менее, все указанные выше преимущества сохраняются, но замена не требуется.
Вы можете обернуть setInterval()
в функцию, которая обеспечит такую возможность:
function instantGratification(fn, delay) {
fn();
setInterval(fn, delay);
}
...после чего вы сможете использовать её следующим образом:
instantGratification(function() {
console.log('вызвано');
}, 3000);
Вот простая версия для новичков без лишних хлопот. Здесь просто объявляется функция, затем она вызывается, и после этого запускается интервал. Всё.
// Объявите свою функцию здесь
function My_Function(){
console.log("foo");
}
// Сначала вызовите функцию
My_Function();
// Установите интервал
var interval = window.setInterval(My_Function, 500);
Остановить вызов setInterval в JavaScript
Как перенаправить на другую веб-страницу?
Где найти документацию по форматированию даты в JavaScript?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub