Ho fatto Javascript basato sul web (vanilla JS, jQuery, Backbone, ecc.) per alcuni anni e recentemente ho lavorato con Node.js. Mi ci è voluto un po 'per ottenere il blocco della programmazione "non bloccante", ma ora mi sono abituato a usare i callback per operazioni di I / O e quant'altro.
Comprendo che Javascript è a thread singolo per natura. Comprendo il concetto del nodo "coda degli eventi". Quello che NON capisco è ciò che determina se una singola operazione javascript è "bloccante" o "non bloccante". Come faccio a sapere su quali operazioni posso dipendere per produrre un output in modo sincrono da utilizzare nel codice successivo e su quali devo passare i callback in modo da poter elaborare l'output una volta completata l'operazione iniziale? C'è un elenco di funzioni Javascript da qualche parte che sono asincroni / non bloccanti e un elenco di quelli che sono sincroni / bloccanti? Che cosa impedisce alla mia app JavaScript di essere una condizione di competizione gigantesca?
So che le operazioni che richiedono molto tempo, come le operazioni di I / O in operazioni Node e AJAX sul Web, richiedono che siano asincrone e quindi utilizzino le richiamate, ma chi sta determinando ciò che si qualifica come "un lungo periodo"? Esiste una sorta di trigger all'interno di queste operazioni che li rimuove dalla normale "coda eventi"? In caso contrario, cosa li rende diversi dalle semplici operazioni come l'assegnazione di valori alle variabili o il looping attraverso gli array, a cui sembra che possiamo dipendere per finire in modo sincrono?
Forse non ci sto nemmeno pensando correttamente - sperando che qualcuno possa dirmi chiaramente. Grazie!