Как начать цикл setInterval немедленно?
В простой setInterval
setInterval(function() {
// Do something every 9 seconds
}, 9000);
Первое действие произойдет через 9 секунд (t=9s
). Как заставить цикл немедленно выполнить первое действие (t=0
)?
Я думаю, что механизм setInterval
имеет цикл Delay - Action - Delay - Action ...
; вместо цикла Action - Delay - Action - Delay ...
.
EDIT: Моя функция действительно представляет собой цикл как
setInterval(function(){
$('.test').each(function(idx){
var duration = 1000;
$(this).delay(duration*idx);
Some stuff here
});
}, 4000);
Ответы
Ответ 1
Вы можете использовать сразу вызываемое выражение функции для этого:
(function doSomething() {
// your code here
window.setInterval(doSomething, 9000);
})();
Обратите внимание, что, хотя функция называется doSomething
, она все еще является выражением функции, а не выражением функции. Имя доступно только внутри тела функции, что позволяет рекурсивно вызывать такие функции. Это поведение определено здесь.
Если вы хотите получить доступ к коду из нескольких мест, используйте вместо этого следующее:
function doSomething() {
}
doSomething();
someelement.addEventListener("click", doSomething);
window.setInterval(doSomething, 9000);
Ответ 2
Иногда я использую этот шаблон...
(function me() {
// Do something every 9 seconds
setTimeout(me, 9000);
})();
Это не совсем то же самое, поскольку он будет ждать, пока что-то не будет выполнено, прежде чем ждать ~ 9 секунд, чтобы вызвать его снова. Но это часто полезно, так что события в очереди событий не складываются бесполезно (как бы маловероятно, что какой-то код займет 9 секунд:)
Обратите внимание, что в старых IE, me
будет протекать во внешнюю область.
Ответ 3
setInterval() - действительно уродливая функция. Я использую эту санированную версию, которая вызывает функцию немедленно, и занимает время в секундах, ПЕРЕД параметром функции, поэтому вызов его с помощью встроенного определения функции действительно выглядит разумным.
function startInterval(seconds, callback) {
callback();
return setInterval(callback, seconds * 1000);
}
Ответ 4
Используйте именованную функцию и вызовите ее и назначьте ее интервалу.
var myFnc = function() {
// Do something every 9 seconds
};
setInterval(myFnc, 9000);
myFnc();
Другой вариант - использовать setTimeout вместо.
var myFnc = function() {
// Do something every 9 seconds
setTimeout(myFnc, 9000);
};
myFnc();