2011-02-01 21 views
10

Dire che ho il seguente codice:Javascript ordine di esecuzione con setTimeout()

function testA { 
    setTimeout('testB()', 1000); 
    doLong(); 
} 

function testB { 
    doSomething(); 
} 

function doLong() { 
    //takes a few seconds to do something 
} 

eseguo testA(). Ho letto che Javascript è a thread singolo. Cosa succede dopo 1000 millisecondi quando viene raggiunto il timeout per testB()?

Alcune possibilità mi viene in mente:

  • testB() è in coda da eseguire dopo doLong() e qualsiasi altra cosa si chiama hanno finito.
  • doLong() viene immediatamente terminato e viene avviato testB().
  • doLong() viene dato un po 'più tempo per essere eseguito prima di essere arrestato (automaticamente o dopo aver richiesto all'utente) e viene avviato testB().
  • doLong() è in pausa, testB() è avviato. Al termine di testB(), riprende lo doLong().

Qual è la risposta corretta? È dipendente dall'implementazione o parte dello standard? *

This question è simile ma non è la stessa, per quanto ne so.

Qualsiasi collegamento consigliato per una migliore comprensione dell'esecuzione di Javascript sarebbe apprezzato.

Grazie!

* Sì, lo so che non tutti i browser seguono gli standard :(

risposta

10

La prima delle vostre ipotesi è quella giusta: testB() is queued up to execute after doLong() and anything else it called have finished.

Se ci vuole più di un secondo per testA per finire, testB sarà semplicemente necessario attendere.

Inoltre, si dovrebbe scrivere setTimeout(testB, 1000) piuttosto che setTimeout('testB()', 1000). Invio di una stringa da setTimeout è, come l'utilizzo di eval, generally considered evil e vi farà nemici;)

+0

Sono arrivato a credere in 'setTimeout (function() {testB(); }, 1000); 'è il modo migliore, sono stato ingannato? –

+2

@ Wizard ombreggiatura: Sì, molto fuorviato. Per quanto ne so, non c'è differenza tra la tua strada e la mia (tranne che la mia è più breve, naturalmente: D). Per illustrare, immagina se abbiamo estratto la tua espressione in una variabile: 'var f = function() {testB(); }; setTimeout (f, 1000); '. Ancora lo stesso significato, ma ora puoi vedere la ridondanza. – Jakob

+1

Grazie, sia per la risposta che per il consiglio sul passaggio di una funzione a setTimeout anziché a String. Sembra che le esercitazioni che ho letto siano un po 'discutibili;) –

Problemi correlati