5

Запустить функцию setInterval без задержки при первом выполнении

9

Как настроить метод setInterval в JavaScript так, чтобы он выполнял функцию немедленно, а затем продолжал выполнять её с заданным интервалом?

5 ответ(ов)

8

Наиболее простым решением в данной ситуации будет просто вызвать функцию 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);
})();

Это определяет функцию и запускает цикл в одном шаге.

3

Я не уверен, что правильно вас понял, но вы можете сделать что-то вроде этого:

setInterval(function hello() {
  console.log('мир');
  return hello;
}(), 5000);

Разумеется, существует множество способов сделать это, но это самый краткий из тех, что я могу предложить.

0

Я наткнулся на этот вопрос по той же причине, и ни одно из предложенных решений не помогает, если вам нужно вести себя точно так же, как 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);
}

Тем не менее, все указанные выше преимущества сохраняются, но замена не требуется.

0

Вы можете обернуть setInterval() в функцию, которая обеспечит такую возможность:

function instantGratification(fn, delay) {
    fn();
    setInterval(fn, delay);
}

...после чего вы сможете использовать её следующим образом:

instantGratification(function() {
    console.log('вызвано');
}, 3000);
0

Вот простая версия для новичков без лишних хлопот. Здесь просто объявляется функция, затем она вызывается, и после этого запускается интервал. Всё.

// Объявите свою функцию здесь
function My_Function(){
  console.log("foo");
}

// Сначала вызовите функцию
My_Function();

// Установите интервал
var interval = window.setInterval(My_Function, 500);
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь