He estado haciendo Javascript basado en la web (JS de vainilla, jQuery, Backbone, etc.) durante algunos años, y recientemente he estado trabajando con Node.js. Me tomó un tiempo acostumbrarme a la programación "sin bloqueo", pero ahora me he acostumbrado a usar devoluciones de llamada para operaciones de E / S y demás.
Entiendo que Javascript es de un solo subproceso por naturaleza. Entiendo el concepto de Nodo "cola de eventos". Lo que NO entiendo es lo que determina si una operación individual de JavaScript está "bloqueando" frente a "no bloqueando". ¿Cómo sé en qué operaciones puedo depender para producir una salida sincrónicamente para usar en el código posterior, y a cuáles tendré que pasar las devoluciones de llamada para poder procesar la salida después de que se complete la operación inicial? ¿Existe una lista de funciones de Javascript en algún lugar que sean asíncronas / sin bloqueo, y una lista de las que son sincrónicas / bloqueantes? ¿Qué impide que mi aplicación Javascript sea una condición de carrera gigante?
Sé que las operaciones que toman mucho tiempo, como las operaciones IO en las operaciones Node y AJAX en la web, requieren que sean asíncronas y, por lo tanto, usan devoluciones de llamada, pero ¿quién determina qué califica como "mucho tiempo"? ¿Hay algún tipo de disparador dentro de estas operaciones que los elimine de la "cola de eventos" normal? Si no es así, ¿qué los hace diferentes de las operaciones simples como asignar valores a variables o recorrer las matrices, de lo que parece que podemos depender para terminar de manera síncrona?
Quizás ni siquiera estoy pensando en esto correctamente, esperando que alguien pueda aclararme. ¡Gracias!
Respuestas:
En general, cualquier función que trabaje en red o use temporizadores para hacer cosas durante un período de tiempo será asíncrona.
Si la función recibe una devolución de llamada, puede ver para qué se utiliza la devolución de llamada y, por lo general, será obvio si es asíncrono o no. Si la función no ofrece una devolución de llamada, entonces no tiene forma de comunicar resultados asincrónicos, por lo que probablemente no sea asincrónica.
No hay forma segura de asegurarlo. Tiene que especificarse en el documento para una función u obvio por la forma en que funciona la interfaz.
Las operaciones asincrónicas son diferentes bajo las cubiertas que las operaciones sincrónicas en que las operaciones asincrónicas tienen la noción de configurar una operación, comenzar la operación y luego recibir una notificación más tarde del progreso, finalización o errores en la operación. Iterar una matriz es una operación síncrona. No tiene ninguno de estos problemas. El código solo se ejecuta sincrónicamente. La emisión de una llamada ajax consiste en registrar una devolución de llamada para notificaciones de estado, luego iniciar la llamada ajax, luego continuar ejecutando otro javascript y luego, un tiempo después, la devolución de llamada se llama con un cambio de estado en la llamada ajax (como la finalización).
fuente
XMLHttpRequest.open
tiene unasync
parámetro booleano que controla si la última llamada asend
es asíncrona.Por lo que entiendo que no estás preguntando por lo que se debe hacer asíncrono, pero cómo saber si una función es asíncrona.
Revisas la documentación. En serio, para eso está. No adivina lo que hace una función en función de su nombre o contexto simplemente así. Si no está seguro y tiene acceso a su código fuente, verifíquelo.
Esa es la única forma completamente confiable.
Ahora para adivinar.
fuente
Como JavaScript tiene un solo subproceso, todos los bloques de procesamiento hasta que se produce uno de los siguientes
1) La ejecución actual solicita un servicio externo, como una solicitud de E / S o de red, o una solicitud de trabajador web
2) Una llamada de función se pone en un temporizador para ejecutarse en un momento posterior
No hay una lista de funciones de bloqueo / no bloqueo. Debes consultar la documentación.
Su aplicación puede encontrar una condición de carrera si varios servicios externos tienen un bloqueo en el hilo de JavaScript e intentan acceder a él al mismo tiempo. Los navegadores modernos y el motor V8 manejan esto, pero puedes encontrar esta condición de carrera si usas phonegap y escribes aplicaciones javascript para dispositivos móviles. El soporte no está ahí para manejar estas condiciones de carrera.
En general, suponga que el código se bloquea a menos que haya una devolución de llamada. E incluso si hay una devolución de llamada, eso no significa que no se bloqueará.
fuente
Yo también soy nuevo en node.js (y JavaScript en general) y no estoy acostumbrado a tanto código asincrónico. Solo quería señalar que en la Descripción general del bloqueo frente al no bloqueo en nodejs.org dice que:
fuente