2012-05-10 20 views
7

Estoy tratando de burlarme de un método que lleva mucho tiempo para realizar pruebas pero no puedo encontrar una buena forma de hacerlo en Javascript. ¿Algún buen enfoque además de escribir un bucle muy largo para?¿Cómo escribo un método síncrono de bloqueo en Javascript?

+0

¿Qué pasa con un bucle muy largo? o un bucle que comprueba el tiempo? – Joseph

+0

Nada mal, solo desearía poder hacer algo como 'dormir (milisegundos)'. Es más difícil averiguar qué tan grande debe ser el ciclo, pero nada de prueba y error no puede solucionarlo. –

+0

En Firefox puede usar [trampolín] (http://tobyho.com/2010/12/10/trampolines-in-javascript-and/ "Trampolines en Javascript y la búsqueda de menos devoluciones de llamada anidadas") para realizar llamadas de JavaScript asíncronas sincrónico. –

Respuesta

7

¿Qué tal a loop that checks time?

function sleep(milliSeconds){ 
    var startTime = new Date().getTime();     // get the current time 
    while (new Date().getTime() < startTime + milliSeconds); // hog cpu until time's up 
} 
+0

Nice. Bastante obvio en retrospectiva. –

+1

Esto puede hacer que el motor de JavaScript bloquee otros hilos (los navegadores como Firefox <4.0 no le permitirán al usuario cambiar pestañas ni hacer nada más). En última instancia, el navegador se dará cuenta de esto y terminará su script. No es Buena idea. –

+0

Funciona en Chrome, eso es todo lo que me importa. Obviamente, esto no entra en ningún código implementado :) –

3

se puede hacer una llamada AJAX sincrónica a un servidor que remite la respuesta de una cierta cantidad de tiempo a lo solicitado por la secuencia de comandos. Sin embargo, tenga en cuenta que este método no funcionará en Firefox ya que no admite llamadas AJAX sincrónicas.

sólo tiene que utilizar esta función simple en el lado del cliente:

function sleep(microseconds) { 
    var request = new XMLHttpRequest; 
    request.open("GET", "/sleep.php?time=" + milliseconds); 
    request.send(); 
} 

El código para sleep.php en el lado del servidor:

usleep(intval($_GET("sleep"))); 

Ahora puede crear el bloqueo de funciones sincrónicas en JavaScript (con la excepción de Firefox) de la siguiente manera:

alert("Hello"); 
sleep(1000000); // sleep for 1 second 
alert("World"); 
+0

+1 es bueno saberlo, pero es demasiado trabajo :) –

Cuestiones relacionadas