JavaScript: стартирайте setInterval при зареждане на страницата

Искам да изпълнявам малко код на всеки 20 секунди. Това работи добре. Но бих искал setInterval да се стартира, когато се срещне за първи път, и след това да започне да измерва времето (вместо първо да прави измерването на времето).

Очевидно мога да направя нещо като:

myFunction();
setInterval(myFunction, 20000);

Но намирам това за малко неелегантно. Бих предпочел да направя нещо подобно

setInterval(myFunction, 20000, { waitBeforeFirstRun: false });

Съществува ли такава настройка за setInterval?


person chadoh    schedule 07.11.2012    source източник
comment
Вашият пример е грешен, вие извиквате функцията, вместо да я присвоите.   -  person epascarello    schedule 07.11.2012
comment
Този въпрос е дубликат на stackoverflow.com/questions/6685396/ .. Аз също го маркирах   -  person Mihai Matei    schedule 07.11.2012
comment
Бих предпочел първо да извикам функцията и след това да я планирам в името на простотата и поддръжката.   -  person AlexStack    schedule 07.11.2012
comment
@MateiMihai Това определено е глупост. Какво означава, че сте го маркирали? Мога ли да затворя цялото това нещо и просто да насоча всички към другия, по-стар въпрос?   -  person chadoh    schedule 09.11.2012
comment
@AlexStack Това е добър подход. Действителният ми код беше малко по-сложен, така че изглеждаше по-лесно, ако не трябваше да правя това. Но това беше моят подход, докато не получих отговор от общността дали има по-добър начин. Всъщност не изглежда така.   -  person chadoh    schedule 09.11.2012


Отговори (2)


Какво ще кажеш:

setInterval(​function foo(){
    // logic
    return foo;
}(), 20000);​
person David Hellsing    schedule 07.11.2012
comment
Много елегантен! За онези читатели със слаби умения за JavaScript (включително и аз), малко обяснение защо са необходими както изразът (), така и изразът return би било много оценено. Това е достатъчно JS-изперкало, за да не съм сигурен, че поставянето му в моята кодова база, написана предимно от Rubyist, би било добра идея и вероятно ще запази имплементацията myFunction();setInterval(myFunction,20000); на място (тъй като вече е написана). Но вашето решение задоволява любопитството ми и ме учи на интересни неща за JS. Академичен успех! Благодаря. - person chadoh; 09.11.2012
comment
() ще изпълни функцията веднага и самото връщане ще инжектира препратката към функцията в setInterval. - person David Hellsing; 09.11.2012

person    schedule
comment
Хубава идея, но как това е по-елегантно от myFunction();setInterval(myFunction, 20000);? Изглежда просто добавя друга обвивка с име. - person David Hellsing; 07.11.2012
comment
Той е наименуван, но е обхванат от тялото си (наименуван израз на функция), т.е. няма да направи нищо със съдържащия се обхват (глобален или друг) - person Esailija; 07.11.2012
comment
Това е добър трик. Както посочва @David, наистина е само въпрос на лични предпочитания и особеностите на ситуацията кое решение да използвате. Не бих заменил непременно първоначалния си подход с това (тъй като кодът ми вече е написан в този момент, намирам това решение за недостатъчно завладяващо, за да го променя). - person chadoh; 09.11.2012