Publicación cruzada desde Reddit.
El propósito de las funciones asíncronas en JavaScript es un poco diferente de lo que busca.
Recuerde que JavaScript tiene un solo subproceso: solo puede hacer una cosa a la vez. Aquí hay alguna tradicional, el código de bloqueo:
sys.puts("Before");
sleep(10);
sys.puts("After");
En una aplicación web en el mundo real, el sleep()
podría ser en cambio un tiempo de llamada base de datos, solicitud de red (como la espera de los datos desde el navegador web del usuario), ayudante herramienta, o acceso a archivos.
Si usó llamadas de bloqueo como las anteriores, el servidor Node.js no podría hacer nada más (como comenzar a gestionar otras solicitudes web) mientras espera.
PHP y muchos otros entornos de programación web manejan esto creando subprocesos totalmente separados para cada solicitud. Node.js usa funciones de devolución de llamada.Se puede escribir el mismo código como este, en su lugar:
sys.puts("Before");
setTimeout(function(){
sys.puts("After");
}, 10000);
Aquí, se crea una función y lo pasa a setTimeout()
. Su código aún no se ha ejecutado, pero cuando lo haga, tendrá acceso a todo el alcance (todas las variables) donde fue creado. setTimeout()
obtiene una referencia a la función y programa un evento para disparar en the event loop una vez que expira el tiempo de espera.
El bucle de eventos es, esencialmente, una lista de tareas pendientes del programa Node.js (son comunes: ¡todas las aplicaciones GUI que se ejecutan en su computadora probablemente utilicen bucles de eventos!).
Después de la llamada a setTimeout()
, la función actual sigue ejecutándose. Finalmente regresa, y la función que lo llamó vuelve, y así sucesivamente, hasta que el programa termina nuevamente en el ciclo de eventos. El ciclo de eventos busca ver si algo ha sucedido (por ejemplo, una solicitud entrante) mientras el código se estaba ejecutando, y llama a la función apropiada en su código. Si no, espera hasta que ocurra algo (como que expira el tiempo de espera).
código asíncrono no deje que su código de hacer muchas cosas al mismo tiempo, no eliminar el bloqueo cuando algún código depende de algo externo para continuar.
Es raro que deba realizar un trabajo de bloqueo dentro de su programa Node.js. Si lo hace, debe separar ese trabajo en un proceso separado (que incluso puede ser otro programa Node.js), o escriba a C/C++ addon, que es libre de usar subprocesos.
¿Tiene alguna idea de cómo logro esto en node.js? Gracias – Richard
Esta pregunta es bastante antigua, pero sigue siendo muy interesante para los principiantes de node.js como yo .. Como se mencionó, node.js es para E/S paralelas que no funcionan en paralelo. Eso significa que: si tiene que realizar un trabajo lento para responder a un solo nodo de solicitud, no acelerará lo que intenta lograr en esa única solicitud. La diferencia entre usar sleep() y setTimeout() es que node.js bloqueará todas las demás solicitudes cuando use sleep() durante el tiempo de inactividad - usar setTimeout() no bloqueará otras solicitudes. O bien, 10 solicitudes para dormir (10s) tomarán 100s: 10 solicitudes para establecer TimeTimeout (10s) solo 10s. – schlicki