Я работаю с Javascript на основе Интернета (vanilla JS, jQuery, Backbone и т. Д.) Уже несколько лет, а недавно я работал с Node.js. Мне потребовалось некоторое время, чтобы освоить «неблокирующее» программирование, но теперь я привык использовать обратные вызовы для операций ввода-вывода и еще много чего.
Я понимаю, что Javascript является однопоточным по своей природе. Я понимаю понятие узла "очередь событий". Что я не понимаю, так это то, что определяет, является ли отдельная операция javascript «блокирующей» по сравнению с «неблокирующей». Как мне узнать, от каких операций я могу зависеть, чтобы синхронно производить вывод для использования в более позднем коде, и от каких мне нужно будет передавать обратные вызовы, чтобы я мог обработать вывод после завершения начальной операции? Есть ли где-нибудь список функций Javascript, которые являются асинхронными / неблокирующими, и список тех, которые являются синхронными / блокирующими? Что мешает моему приложению Javascript быть одним из гигантских состояний гонки?
Я знаю, что операции, которые занимают много времени, такие как операции ввода-вывода в Node и операции AJAX в Интернете, требуют, чтобы они были асинхронными и, следовательно, использовали обратные вызовы - но кто определяет, что можно квалифицировать как «долгое время»? Есть ли какой-то триггер в этих операциях, который удаляет их из обычной "очереди событий"? Если нет, то чем они отличаются от простых операций, таких как присваивание значений переменным или циклическая обработка массивов, от которых кажется, что мы можем зависеть, чтобы завершить синхронно?
Возможно, я даже не думаю об этом правильно - надеясь, что кто-то может привести меня в порядок. Благодарность!