2012-05-12 3 views
36

В простом setIntervalКак начать цикл setInterval сразу?

setInterval(function() { 
     // Do something every 9 seconds 
}, 9000); 

Первое действие будет происходить через 9 секунд (t=9s). Как заставить цикл немедленно выполнить первое действие (t=0)?

Я думаю, из-за механизма setInterval иметь Delay - Action - Delay - Action ... loop; вместо цикла Action - Delay - Action - Delay ....

EDIT: Моя функция действительно петля, как

setInterval(function(){ 
$('.test').each(function(idx){ 
    var duration = 1000; 
    $(this).delay(duration*idx); 
    Some stuff here 
}); 
}, 4000); 

ответ

76

Держите его просто. Вы можете использовать именованную функцию вместо анонимной функции; вызовите его и установите для него интервал.

function doSomething() { 
    console.log("tick"); 
} 
doSomething(); 
setInterval(doSomething, 9000); 

Создание области, если необходимо:

(function() { 
    function doSomething() { 
     console.log("tick"); 
    } 
    doSomething(); 
    setInterval(doSomething, 9000); 
})(); 

Наконец, следующие работы без создания или влияющих на x:

setInterval(function x() { 
    console.log("tick"); 
    return x; 
}(), 9000); 
+0

Ницца, простое решение, спасибо! –

+1

Первая часть этого ответа будет постепенно замедляться, поскольку новый 'setInterval' создается каждый цикл. Это можно устранить, заменив 'window.setInterval' на' setTimeout'. – spikespaz

17

Иногда я использую этот шаблон ...

(function me() { 
    // Do something every 9 seconds 

    setTimeout(me, 9000); 
})(); 

Это не совсем то же самое, что и до тех пор, пока не сделает что-то, прежде чем ждать ~ 9 секунд, чтобы позвонить ему снова. Но это часто полезно, так что события в очереди событий не складываются бесполезно (как бы маловероятно, что какой-то код займет 9 секунд)

Обратите внимание, что в старых IE, me будет протекать во внешнюю область ,

+0

* «Обратите внимание, что в старых IE, я просочится во внешнюю область». * И в разные моменты времени создаются две разные функции с одним и тем же кодом. * Первый раз, когда ваш код работает, это один из них; все последующие времена это другое. Странно, но верно. –

+0

Хотелось бы, чтобы это работало без проблем во всех браузерах. Это просто так чисто. Какие версии IE неисправны? – thekingoftruth

+0

@thekingoftruth Он должен * работать * без проблем, он просто пропустит идентификатор 'me' в IE. Из памяти это <= IE8, у которого есть проблема. – alex

2

Используйте именованную функцию и вызовите ее и назначьте ее интервалу.

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(); 
+2

Это не именованная функция. Это анонимная функция, назначенная переменной. * Variable * имеет имя, функция не работает (что отлично подходит для того, что вы делаете, кроме того, что некоторые отладчики не смогут показать вам полезное имя в столах вызовов и т. д. [другие делают, последние инструменты Chrome Dev и Firebug довольно умны]). –

12

setInterval() - действительно уродливая функция. Я использую эту санированную версию, которая вызывает функцию немедленно и занимает время в секундах, ПЕРЕД параметром функции, поэтому вызов его с помощью встроенного определения функции действительно выглядит разумным.

function startInterval(seconds, callback) { 
    callback(); 
    return setInterval(callback, seconds * 1000); 
} 
Смежные вопросы