Выполнять функцию setInterval без задержки в первый раз



это есть способ настроить setInterval метод javascript для немедленного выполнения метода, а затем выполняется с таймером

548   12  

12 ответов:

проще всего просто вызвать функцию непосредственно в первый раз:

foo();
setInterval(foo, delay);

однако есть веские причины, чтобы избежать setInterval - в частности, в некоторых случаях весь груз setInterval событий может прибыть сразу после друг друга без каких-либо задержек. Другая причина заключается в том, что если вы хотите остановить цикл, вы должны явно вызвать clearInterval что означает, что вы должны помнить дескриптор, возвращенный от оригинала setInterval звонок.

так альтернативный метод-иметь foo сам триггер для последующих вызовов с помощью :

function foo() {
   // do stuff
   // ...

   // and schedule a repeat
   setTimeout(foo, delay);
}

// start the cycle
foo();

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

еще лучше, вы можете обернуть все это в сразу же вызывается функция-выражение что создает функция, которая затем вызывает себя снова, как указано выше, и автоматически запускает цикл:

(function foo() {
    ...
    setTimeout(foo, delay);
})();

который определяет функцию и запускает цикл все за один раз.

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

setInterval(function hello() {
  console.log('world');
  return hello;
}(), 5000);

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

вот обертка, чтобы довольно-fy его, если вам это нужно:

(function() {
    var originalSetInterval = window.setInterval;

    window.setInterval = function(fn, delay, runImmediately) {
        if(runImmediately) fn();
        return originalSetInterval(fn, delay);
    };
})();

установите третий аргумент setInterval в true, и он будет работать в первый раз сразу после вызова setInterval:

setInterval(function() { console.log("hello world"); }, 5000, true);

или опустите третий аргумент, и он сохранит свое первоначальное поведение:

setInterval(function() { console.log("hello world"); }, 5000);

некоторые браузеры поддерживают дополнительные параметры для setInterval, который эта обертка не учитывает; я думаю, что они редко используются, но держите это в не возражайте, если они вам понадобятся.

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

вот мое решение этой проблемы:

function setIntervalImmediately(func, interval) {
  func();
  return setInterval(func, interval);
}

преимущество этого решения:

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

пример:

// create 1 second interval with immediate execution
var myInterval = setIntervalImmediately( _ => {
        console.log('hello');
    }, 1000);

// clear interval after 4.5 seconds
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( 'invoked' );
}, 3000);

// YCombinator
function anonymous(fnc) {
  return function() {
    fnc.apply(fnc, arguments);
    return fnc;
  }
}

// Invoking the first time:
setInterval(anonymous(function() {
  console.log("bar");
})(), 4000);

// Not invoking the first time:
setInterval(anonymous(function() {
  console.log("foo");
}), 4000);
// Or simple:
setInterval(function() {
  console.log("baz");
}, 4000);

Я предлагаю вызывать функции в следующей последовательности

var _timer = setInterval(foo, delay, params);
foo(params)

вы также можете пройти _timer к фу, если хочешь clearInterval(_timer) при определенном условии

var _timer = setInterval(function() { foo(_timer, params) }, delay);
foo(_timer, params);

чтобы решить эту проблему , я запускаю функцию в первый раз после загрузки страницы.

function foo(){ ... }

window.onload = function() {
   foo();
};

window.setInterval(function()
{
    foo(); 
}, 5000);

есть удобный пакет npm под названием firstInterval (полное раскрытие, это мое).

многие примеры здесь не включают обработку параметров и изменение поведения по умолчанию setInterval в любом крупном проекте есть зло. Из документов:

эта модель

setInterval(callback, 1000, p1, p2);
callback(p1, p2);

идентичен

firstInterval(callback, 1000, p1, p2);

Если вы старая школа в браузере и не хотите зависимости, это легко вырезать и вставить из в код.

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

//Declare your function here
function My_Function(){
  console.log("foo");
}    

//Call the function first
My_Function();

//Set the interval
var interval = window.setInterval( My_Function, 500 );

существует проблема с немедленным асинхронным вызовом вашей функции, потому что стандартный setTimeout / setInterval имеет минимальный тайм-аут около нескольких миллисекунд, даже если вы непосредственно установите его в 0. Это вызвано конкретной работой браузера.

пример кода с реальной нулевой задержкой, который работает в Chrome, Safari, Opera

function setZeroTimeout(callback) {
var channel = new MessageChannel();
channel.port1.onmessage = callback;
channel.port2.postMessage('');
}

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

и после первого ручного вызова вы можете создать интервал с функция.

на самом деле самый быстрый, чтобы сделать

interval = setInterval(myFunction(),45000)

это вызовет myfunction, а затем будет делать это agaian каждые 45 секунд, что отличается от выполнения

interval = setInterval(myfunction, 45000)

, который не буду называть его, но запланировать его только

Comments

    Ничего не найдено.