Faccio Javascript basato sul web (vaniglia JS, jQuery, Backbone, ecc.) Da alcuni anni ormai e recentemente ho lavorato un po 'con Node.js. Mi ci è voluto un po 'per capire la programmazione "non bloccante", ma ora mi sono abituato a usare i callback per operazioni di IO e quant'altro.
Capisco che Javascript è a thread singolo per natura. Comprendo il concetto di "coda eventi" del nodo. Ciò che NON capisco è ciò che determina se una singola operazione javascript è "bloccante" rispetto a "non bloccante". Come faccio a sapere da quali operazioni posso fare affidamento per produrre un output in modo sincrono da utilizzare in un codice successivo, e quali a cui dovrò passare i callback per poter elaborare l'output al termine dell'operazione iniziale? Esiste un elenco di funzioni Javascript asincrone / non bloccanti e un elenco di funzioni sincrone / bloccanti? Cosa impedisce alla mia app Javascript di essere una condizione di gara gigantesca?
So che le operazioni che richiedono molto tempo, come le operazioni di I / O nelle operazioni Nodo e AJAX sul Web, richiedono che siano asincrone e quindi utilizzano i callback - ma chi sta determinando ciò che si qualifica come "un lungo tempo"? Esiste una sorta di trigger all'interno di queste operazioni che li rimuove dalla normale "coda degli eventi"? In caso contrario, cosa li rende diversi dalle semplici operazioni come l'assegnazione di valori alle variabili o il looping di matrici, da cui sembra che possiamo dipendere per terminare in modo sincrono?
Forse non ci sto nemmeno pensando correttamente - sperando che qualcuno mi possa mettere in chiaro. Grazie!