Autor Zpráva
Witiko
Profil
Často vídám js "kodéry" prohlašovat, že řetězením setTimeout:

(function() {
  function funkce() {
    // kód
    setTimeout(funkce, time)
  }
  funkce()
})()


Lze dosáhnout přešnějších intervalů, než při použití setInterval:

window.setInterval(function() {
  // kód
}, time)


Rád bych odkázal na výborný článek:
How javascript timers work

Javascript je ze své podstaty jednovláknový, laicky řečeno nedokáže dělat víc věcí naráz (při tom mě napadá další skupina "kodérů", kteří algorytmus rozdělí mezi x intervalů a očekávají rychlejší chod). Shrnu-li velmi stručně obsah článku, tak jak setInterval tak setTimeout mohou (a většinou budou) mít mírné spoždění pakliže musí javascript zpracovávat asynchronně i jiný kód, nicméně setInterval zaregistruje svůj požadavek do fronty každou periodu, zatímco při využití setTimeout bude docházet s každou znovudefinicí k posunu. Není bez zajímavosti, že při registraci nového volání callback funkce intervalu do fronty se předchozí registrace intervalu ve frontě vymaže (viz. vypuštění intervalu 2 v příkladu dole)

Názorná ukázka s desetisekundovým intervalem a timeoutem:

------------------------------------------10ms--------20ms--------30ms--------40ms--------50ms---
setInterval registrace do fronty: ---------1------------2----------3-----------4------------5----
setInterval spuštění kódu: ------------------1------------------------------3---4-------------5--
setTimeout registrace timeoutu: -1-----------2------------------------------3---------------4----
setTimeout spuštění kódu: -------------------1------------------------------2---------------3----
Co se děje na pozadí:--------------------------- (Zpracování XMLHttpRequest) ------------------->
_es
Profil
Neviem, aký má zmysel vytvorenie "témy" s odkazom na jeden článok a opísanie nejakých častí z toho článku.
Každé použitie setInterval a setTimeout rôznymi spôsobmi má svoje výhody a nevýhody a každé môže byť vhodné na niečo iné. Nechápem teda, aké "omyly" sa tu vyvracajú.
Ešte sa môže niekedy hodiť kód:
for(var t = začiatok; t < koniec; t += krok) setTimeout(funkcia, t);
function funkcia(){nejaký kód}
Witiko
Profil
Myslím, že smysl postu jsem popsal. Namísto opsání bych to nazýval spíše citací a pokusem o vizuální ztvárnění pro českého čtenáře vzhledem k tomu, že uvádím odkaz zdrojového článku pro lidi, co umí anglicky a chtějí ten článek celý číst - což doporučuji. Více než často mi lidi tvrdí, že nekonečná reinicializace setTimeout je lepším ekvivalentem setInterval. Také názor, že setInterval a setTimeout vytvoří vlákno, které funguje nezávisle na běhu hlavního vlákna programu je mylný, leč hojně rozšířený, chtěl jsem odkázat na tento kvalitní článek, který zasvěcuje do způsobu jakým obě funkce fungují a liší se od sebe a stejně tak do způsobu jakým javascriptový runtime funguje.

Bylo by lepší, kdybych sem poslal pouze odkaz na článek bez čehokoliv jiného?

Jinak zmíněný kód je u jistých scriptů s potřebou časované změny (hlavně u vizuálních funkcí) skutečně chlebem a vodou právě kvůli výše popsanému nešvaru, kdy při přetížení může dojít u setInterval k upuštění nějakých volání, zatímco u setTimeout dojde vždy k zavolání všech.

for(var foo = 0; foo <= 10000; foo += 1000) {
  (function(bar) {
    setTimeout(function(){
      alert("Lexikální uzávěr je prima, počítáme do deseti: " + bar/1000)
    }, bar)
  })(foo)
}
_es
Profil
Witiko:
Zmyslom toho originálneho článku bolo veci vysvetliť, ty sa však pokúšaš vysvetliť nejaké "omyly" "kóderov".
Snažíš sa vyvrátiť:
Často vídám js "kodéry" prohlašovat, že řetězením setTimeout: ... Lze dosáhnout přešnějších intervalů, než při použití setInterval:
no ak je treba napríklad dosiahnuť, aby interval medzi jednotlivými volaniami funkcie nebol menší ako zvolený čas, tak je ten prvý kód vhodný, len je trochu neefektívny, lebo sa stále vytvára nová funkcia, lepšie by asi bolo:
(function() {
  function funkce() {
    // code
    setTimeout(funkce, time);
  }
  funkce();
})();
Witiko
Profil
Obě dvě funkce mají svá specifická využití, k jejich pochopení výrazně napomáhá porozumění rozdílům v jejich fungování. Avšak to, že spousta kódů používá setTimeout namísto setInterval bez jakéhokoliv rozumného důvodu (cyklování window.setTimeout(funkce, 995) je nádherný způsob odpočítávání času) je fakt, který uvádím spolu s častým mýlením se co se týče problematiky jednovláknové podstaty javascriptu jako důvod, proč si článek nebo alespoň můj zkrácený výcuc přečíst. Psát, že je článek zajímavý není relevantní, tak místo toho píšu proč si myslím, že je dobré si článek přečíst a kdo hlavně by měl napnout slechy.

Jinak ano, funkce nebyla určená k efektivitě, ale vyjádření co mám na mysli jedním výrazem - což není moc přehledné, hodil jsem do příspěvku jedna pro přehlednost tvůj kód.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0