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