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!