Faço Javascript com base na Web (vanilla JS, jQuery, Backbone, etc.) há alguns anos e, recentemente, venho trabalhando com o Node.js. Demorei um pouco para entender a programação "sem bloqueio", mas agora me acostumei a usar retornos de chamada para operações de IO e outros enfeites.
Entendo que o Javascript é único por natureza. Eu entendo o conceito do nó "fila de eventos". O que eu não entendo é o que determina se uma operação javascript individual está "bloqueando" versus "não bloqueando". Como sei de quais operações posso confiar para produzir uma saída de forma síncrona para uso em códigos posteriores e quais eu precisarei transmitir retornos de chamada para poder processar a saída após a conclusão da operação inicial? Existe uma lista de funções Javascript em algum lugar assíncrono / sem bloqueio e uma lista de funções síncronas / bloqueando? O que está impedindo meu aplicativo Javascript de ser uma condição de corrida gigante?
Sei que operações que demoram muito tempo, como operações de E / S em operações de Nó e AJAX na Web, exigem que sejam assíncronas e, portanto, usem retornos de chamada - mas quem está determinando o que qualifica como "muito tempo"? Existe algum tipo de gatilho nessas operações que as remove da "fila de eventos" normal? Caso contrário, o que os diferencia de operações simples, como atribuir valores a variáveis ou fazer loop em matrizes, das quais parece que podemos confiar para concluir de maneira síncrona?
Talvez eu nem esteja pensando nisso corretamente - esperando que alguém possa me esclarecer. Obrigado!