2011-02-01 24 views
10

decir que tengo el siguiente código:para la ejecución de Javascript con setTimeout()

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

function testB { 
    doSomething(); 
} 

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

ejecuto testA(). He leído que Javascript tiene un único subproceso. ¿Qué sucede después de 1000 milisegundos, cuando se alcanza el tiempo de espera para testB()?

Algunas de las posibilidades que se me ocurren:

  • testB() se ponen en cola para ejecutar después doLong() y cualquier otra cosa que llamó han terminado.
  • doLong() se termina inmediatamente y se inicia testB().
  • doLong() se le da un poco más de tiempo para ejecutar antes de ser detenido (ya sea automáticamente o después de preguntar al usuario) y se inicia testB().
  • doLong() está en pausa, testB() se pone en marcha. Después de que se haya terminado testB(), se reanuda doLong().

¿Cuál es la respuesta correcta? ¿Es dependiente de la implementación o parte del estándar? *

This question es similar pero no es lo mismo, por lo que puedo ver.

Cualquier enlace que se puede recomendar para una mejor comprensión ejecución de Javascript sería apreciada.

Gracias!

* Sí, ya sé que no todos los navegadores siguen los estándares :(

Respuesta

10

El primero de sus conjeturas es la correcta: testB() is queued up to execute after doLong() and anything else it called have finished.

Si se tarda más de un segundo para testA a fin, testB simplemente tendrá que esperar.

también, usted debe escribir setTimeout(testB, 1000) en lugar de setTimeout('testB()', 1000). Envío de una cadena a setTimeout es, como el uso de eval, generally considered evil y le hará enemigos;)

+0

que llegaron a creer 'setTimeout (function() {TESTB(); }, 1000); 'es la mejor manera, ¿me engañaron? –

+2

@Shadow Wizard: Sí, bastante mal. Por lo que yo sé, no hay diferencia entre tu camino y el mío (excepto que el mío es más corto, por supuesto: D). Para ilustrar, imagine si sacamos su expresión en una variable: 'var f = function() {testB(); }; setTimeout (f, 1000); '. Sigue teniendo el mismo significado, pero ahora puedes ver la redundancia. – Jakob

+1

Gracias, tanto por la respuesta como por el consejo sobre pasar una función a setTimeout en lugar de una cadena. Parece que los tutoriales que he estado leyendo son un poco dudosos;) –

Cuestiones relacionadas