Здесь есть способ настроить метод setInterval
javascript для немедленного выполнения метода и затем выполняется с помощью таймера
Выполнить функцию setInterval без задержки в первый раз
Ответ 1
Проще всего просто вызвать функцию непосредственно в первый раз:
foo();
setInterval(foo, delay);
Однако есть веские причины, чтобы избежать setInterval
- в частности, в некоторых случаях вся загрузка событий setInterval
может прибыть сразу после друг друга без какой-либо задержки. Другая причина заключается в том, что если вы хотите остановить цикл, вы должны явно вызвать clearInterval
, что означает, что вы должны помнить дескриптор, возвращенный из исходного вызова setInterval
.
Таким образом, альтернативный метод состоит в том, чтобы foo
запускать сам для последующих вызовов, используя setTimeout
вместо этого:
function foo() {
// do stuff
// ...
// and schedule a repeat
setTimeout(foo, delay);
}
// start the cycle
foo();
Это гарантирует, что между вызовами существует как минимум интервал delay
. Это также упрощает отмену цикла, если это необходимо - вы просто не вызываете setTimeout
, когда достигнуто условие завершения цикла.
Еще лучше, вы можете обернуть это все в сразу вызываемое выражение функции, которое создает функцию, которая затем снова вызывает себя, как указано выше, и автоматически запускает цикл:
(function foo() {
...
setTimeout(foo, delay);
})();
который определяет функцию и запускает цикл за один раз.
Ответ 2
Я не уверен, правильно ли я понимаю вас, но вы можете легко сделать что-то вроде этого:
setInterval(function hello() {
console.log('world');
return hello;
}(), 5000);
Очевидно, существует множество способов сделать это, но это самый сжатый способ, о котором я могу думать.
Ответ 3
Вот обертка, чтобы красиво, если вам это нужно:
(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, которые эта оболочка не учитывает; Я думаю, что они используются редко, но имейте это в виду, если они вам нужны.
Ответ 4
Я наткнулся на этот вопрос из-за одной и той же проблемы, но ни один из ответов не поможет, если вам нужно вести себя точно так же, как 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);
}
Тем не менее, все преимущества, перечисленные выше, применяются здесь, но замена не требуется.
Ответ 5
Вы можете обернуть setInterval()
в функцию, которая обеспечивает это поведение:
function instantGratification( fn, delay ) {
fn();
setInterval( fn, delay );
}
... затем используйте его следующим образом:
instantGratification( function() {
console.log( 'invoked' );
}, 3000);
Ответ 6
Если вы извлечете код, который вы передаете в setInterval
, в функцию, вы можете вызвать функцию непосредственно сразу после вызова setInterval
. Это обеспечивает тот же эффект.
Ответ 7
// 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);
Ответ 8
Я предлагаю вызывать функции в следующей последовательности
var _timer = setInterval(foo, delay, params);
foo(params)
Вы также можете передать _timer
в foo, если вы хотите clearInterval(_timer)
при определенном условии
var _timer = setInterval(function() { foo(_timer, params) }, delay);
foo(_timer, params);
Ответ 9
Чтобы решить эту проблему, я запускаю функцию в первый раз после загрузки страницы.
function foo(){ ... }
window.onload = function() {
foo();
};
window.setInterval(function()
{
foo();
}, 5000);
Ответ 10
Использование:
function poll(f, i){
var cancel = false;
function again(){
f();
cancel || setTimeout(again, i);
}
again();
return function(){
cancel = true;
}
}
poll(task, 1000);
С помощью эффектов пользовательского интерфейса составьте anim
в poll
, чтобы еще больше уменьшить накладные расходы:
function anim(f){
var waf = window.requestAnimationFrame; //browser support?
return waf ? function(){
waf(f)
} : f;
}
poll(anim(taskUI), 1000);
Ответ 11
Есть удобный пакет npm под названием firstInterval (полное раскрытие, оно мое).
Многие из приведенных здесь примеров не включают обработку параметров, и изменение поведения по умолчанию setInterval
в любом крупном проекте - зло. Из документов:
Этот шаблон
setInterval(callback, 1000, p1, p2);
callback(p1, p2);
идентично
firstInterval(callback, 1000, p1, p2);
Если вы работаете в браузере по старому стилю и не хотите зависимости, это легко вырезать и вставить из кода.
Ответ 12
Для кого-то нужно принести внешнее this
внутрь, как будто это функция стрелки.
(function f() {
this.emit("...");
setTimeout(f.bind(this), 1000);
}).bind(this)();
Если вышеуказанное производство мусора беспокоит вас, вы можете вместо этого сделать закрытие.
(that => {
(function f() {
that.emit("...");
setTimeout(f, 1000);
})();
})(this);
Или, возможно, рассмотрите возможность использования декоратора @autobind
зависимости от вашего кода.
Ответ 13
Здесь простая версия для новичков без всего возни. Он просто объявляет функцию, вызывает ее, затем запускает интервал. Это.
//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 );
Ответ 14
Проблема с немедленным асинхронным вызовом вашей функции, поскольку стандартный setTimeout/setInterval имеет минимальный тайм-аут около нескольких миллисекунд, даже если вы прямо установили его в 0. Это вызвано спецификой работы браузера.
Пример кода с нулевой задержкой REAL, которая работает в Chrome, Safari, Opera
function setZeroTimeout(callback) {
var channel = new MessageChannel();
channel.port1.onmessage = callback;
channel.port2.postMessage('');
}
Вы можете найти дополнительную информацию здесь
И после первого ручного вызова вы можете создать интервал с вашей функцией.
Ответ 15
на самом деле самое быстрое выполнение
interval = setInterval(myFunction(),45000)
это вызовет myfunction, а затем сделает это agaian каждые 45 секунд, что отличается от выполнения
interval = setInterval(myfunction, 45000)
который не будет называть его, но расписал его только