vez una tiempo solo segundos retardo reloj funcion ejecutar despues cada javascript setinterval

una - reloj javascript setinterval



Ejecute la funciĆ³n setInterval sin demora la primera vez (12)

Es allí una forma de configurar el método setInterval de javascript para ejecutar el método inmediatamente y luego ejecutarlo con el temporizador


Aquí hay un envoltorio para embellecerlo si lo necesitas:

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

Establezca el tercer argumento de setInterval en verdadero y se ejecutará por primera vez inmediatamente después de llamar a setInterval:

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

O omita el tercer argumento y mantendrá su comportamiento original:

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

Algunos navegadores admiten argumentos adicionales para setInterval que este contenedor no tiene en cuenta; Creo que rara vez se usan, pero tenlo en cuenta si los necesitas.


Aquí hay una versión simple para los principiantes sin toda la confusión. Simplemente declara la función, la llama y luego inicia el intervalo. Eso es.

//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 );


Es más simple llamar la función directamente la primera vez:

foo(); setInterval(foo, delay);

Sin embargo, existen buenas razones para evitar setInterval : en particular, en algunas circunstancias, una carga completa de eventos setInterval puede llegar inmediatamente una detrás de la otra sin demora. Otra razón es que si desea detener el bucle, debe llamar explícitamente a clearInterval que significa que debe recordar el identificador devuelto por la llamada setInterval original.

Entonces, un método alternativo es hacer que foo active para las llamadas subsiguientes usando setTimeout en setTimeout lugar:

function foo() { // do stuff // ... // and schedule a repeat setTimeout(foo, delay); } // start the cycle foo();

Esto garantiza que hay al menos un intervalo de delay entre las llamadas. También hace que sea más fácil cancelar el bucle si es necesario, simplemente no llama a setTimeout cuando se setTimeout su condición de terminación de bucle.

Mejor aún, puede envolver todo eso en una expresión de función invocada de inmediato, que crea la función, que luego se llama a sí misma como se indica anteriormente e inicia automáticamente el ciclo:

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

que define la función y comienza el ciclo todo de una vez.


Existe un problema con la llamada asíncrona inmediata de su función, porque setTimeout / setInterval estándar tiene un tiempo de espera mínimo de varios milisegundos, incluso si lo configura directamente a 0. Esto se debe a un trabajo específico del navegador.

Un ejemplo de código con un retardo de cero REAL que funciona en Chrome, Safari, Opera

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

Puedes encontrar más información here

Y después de la primera llamada manual, puede crear un intervalo con su función.


Hay un conveniente paquete npm llamado firstInterval (revelación completa, es mío).

Muchos de los ejemplos aquí no incluyen el manejo de parámetros, y cambiar los comportamientos predeterminados de setInterval en cualquier proyecto grande es malo. De la documentación:

Este patrón

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

es idéntico a

firstInterval(callback, 1000, p1, p2);

Si estás en la escuela secundaria en el navegador y no quieres la dependencia, es fácil cortar y pegar desde el código.


Me encontré con esta pregunta debido al mismo problema, pero ninguna de las respuestas ayuda si necesita comportarse exactamente como setInterval() pero con la única diferencia de que la función se llama inmediatamente al principio.

Aquí está mi solución a este problema:

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

La ventaja de esta solución:

  • El código existente que usa setInterval se puede adaptar fácilmente mediante sustitución
  • trabaja en modo estricto
  • Funciona con funciones nombradas existentes y cierres.
  • todavía puede usar el valor de retorno y pasarlo a clearInterval() más tarde

Ejemplo:

// create 1 second interval with immediate execution var myInterval = setIntervalImmediately( _ => { console.log(''hello''); }, 1000); // clear interval after 4.5 seconds setTimeout( _ => { clearInterval(myInterval); }, 4500);

Para ser descarado, si realmente necesitas usar setInterval , también puedes reemplazar el setInterval original. Por lo tanto, no se requiere ningún cambio de código al agregar esto antes de su código existente:

var setIntervalOrig = setInterval; setInterval = function(func, interval) { func(); return setIntervalOrig(func, interval); }

Sin embargo, todas las ventajas enumeradas anteriormente se aplican aquí, pero no es necesaria ninguna sustitución.


No estoy seguro de si te estoy entendiendo correctamente, pero fácilmente podrías hacer algo como esto:

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

Obviamente hay muchas formas de hacer esto, pero esa es la forma más concisa en la que puedo pensar.


Para resolver este problema, ejecuto la función por primera vez después de que la página se haya cargado.

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


Podría envolver setInterval() en una función que proporciona ese comportamiento:

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

... entonces úsalo así:

instantGratification( function() { console.log( ''invoked'' ); }, 3000);


Sugeriré llamar a las funciones en la siguiente secuencia

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

También puede pasar el _timer al foo, si desea clearInterval(_timer) en una determinada condición

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


en realidad lo más rápido es hacer

interval = setInterval(myFunction(),45000)

esto llamará mi función, y luego lo hará de nuevo cada 45 segundos, lo que es diferente a hacerlo

interval = setInterval(myfunction, 45000)

que no lo llamará, sino que lo programará solo


// 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);