2015-04-30 11 views
5

Mi sono guardato intorno cercando di capire come SetInterval ma ho trovato solo come usarlo. So già che è la funzionalità, sono solo curioso di sapere come è in grado di eseguire qualcosa su un thread separato quando JS non supporta il threading (almeno questo è quello che ho letto).SetInterval esegue le cose su un thread separato? Come funziona il metodo?

Spero di aver formulato correttamente la domanda.

Grazie.

+2

Sembra che tu voglia conoscere il ciclo degli eventi: https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop –

+1

C'è un bel po 'di informazioni esistenti su questa domanda e varianti - vedi http://stackoverflow.com/questions/2253586, http://stackoverflow.com/questions/4037738, http://stackoverflow.com/questions/28650804, http://stackoverflow.com/questions/1663125 ad es. (TLDR: setInterval * potrebbe * utilizzare internamente i thread, ma * sempre * esegue il codice di callback atomicamente/reciprocamente su qualsiasi altro JavaScript in esecuzione * nello * stesso contesto del programma: una pagina diversa o un WebWorker o stabilisce un contesto di programma diverso). – user2864740

risposta

3

setInterval non esegue nulla su un thread diverso. Pianifica qualcosa da eseguire in determinati orari a condizione che il runtime JS sia inattivo in quel momento.

È possibile provare questo comportamento con qualcosa di simile:

setInterval(function(){ alert("Hello"); }, 1000); 
while (true) { } 

Il ciclo infinito impedirà il function esecuzione, perché il runtime JS è bloccato nel ciclo.

+0

Corretto, ma ho bisogno di un po 'più di informazioni su come "funziona in determinati momenti". –

+1

@ JoséCorretjer-Gómez "Quando nessun altro JavaScript è in esecuzione". L'esempio sopra, con il ciclo per sempre, * sempre * mantiene JavaScript nello stesso contesto del programma in esecuzione in modo che la callback del timer JavaScript non possa mai essere eseguita (anche se è attivata internamente). Un esempio di "idle" sarebbe dopo che una pagina è stata caricata e che i gestori di eventi sono stati aggiunti agli elementi, ma non esiste JavaScript in esecuzione - solo callback che attendono di essere attivati ​​(incluso il timeout). – user2864740

+1

Ciò a cui Timothy si riferisce è chiamato Loop degli eventi. Questo ragazzo ci ha parlato molto bene: https://www.youtube.com/watch?v=8aGhZQkoFbQ – Edo