Подтвердить что ты не робот

Как начать цикл 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);
4b9b3361

Ответ 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();