Sabiendo que mientras Node.js está trabajando de forma asíncrona, escribir algo como esto:Node.js: mientras devolución de llamada bucle no funciona como se esperaba
function sleep() {
var stop = new Date().getTime();
while(new Date().getTime < stop + 15000) {
;
}
}
sleep();
console.log("done");
... llamaría el sueño(), bloquean el servidor de la duración del ciclo while (15 segundos) y simplemente ENTONCES imprimir "hecho" a la consola. Por lo que yo entiendo, esto se debe a que Node.js le está dando acceso a JavaScript solo al hilo principal, y por lo tanto este chiflado detendrá su posterior ejecución.
por lo que entiendo la solución a esto es utilizar devoluciones de llamada:
function sleep(callback) {
var stop = new Date().getTime();
while(new Date().getTime() < stop + 15000) {
;
}
callback();
}
sleep(function() {
console.log("done sleeping");
});
console.log("DONE");
así que pensé que imprimiría 'Hecho' y después de 15 segundos. 'hecho dormir', ya que se llama a la función dormir() y se le da un puntero a una función de devolución de llamada. Mientras esta función está funcionando (el ciclo while), se ejecutará la última línea (imprimir 'hecho'). Después de 15 segundos, cuando la función dormir() finaliza, llama a la función de devolución de llamada dada, que luego imprime 'hecho dormir'.
Aparentemente entendí algo mal aquí, porque las dos formas anteriores bloquean. ¿Alguien puede aclarar por favor?
Gracias de antemano, Slagjoeyoco
Usted está complicando a sí mismo. Un simple setTimeout (devolución de llamada, retardo) debería ser suficiente para producir lo mismo que se indica de forma asincrónica. –
@ FabiánH.jr. el punto es que OP podría estar interesado en entender por qué su 'while' no está funcionando y cómo puede escribirse un' while' de una manera no bloqueante, lo cual es en cierto modo una mejor respuesta que "no importa tu método no funciona, hazlo de esta otra manera ". – Mahn
Bien, gran respuesta en general y ahora que lo mencionas fue bastante perspicaz en el proceso interno de node.js –