Это зависит от потока управления. Node.js делает акцент на том, что он асинхронный, и один из главных недостатков асинхронности заключается в том, что код не работает так, как вы могли бы привыкнуть к синхронизированному языку.
На синхронном языке вызывающий абонент блокируется, пока функция ожидает некоторые данные. Это делает работу программистов довольно простой, потому что они могут быть уверены, что когда функция, ожидающая данных, вернется, будут данные для потребителя.
Это полная противоположность в асинхронном языке или с неблокирующим вводом / выводом. В этом случае вызывающая сторона блокируется на время вызова функции, однако функции не должны ждать завершения данных или ввода-вывода перед возвратом. Это немного усложняет работу программиста, поскольку при возврате вызова функции нет никаких гарантий того, будут ли доступны данные. Следовательно, неблокирующий ввод-вывод обычно подразумевает функции обратного вызова, которые вызываются, когда доступны данные для обработки.
try/catch
блоки работают со стеком вызовов. То есть, когда выдается исключение, среда выполнения раскручивает стек вызовов, пока не найдет блок catch
, который окружает вызов, вызвавший исключение. Но, поскольку http.get
является неблокирующим вызовом, он завершается сразу после регистрации некоторых обратных вызовов, и обработка продолжается. Обратные вызовы вызываются в отдельном «потоке», и поэтому вызовы не вложены в исходный блок try/catch
.
Диаграмма действительно помогла бы объяснить здесь, но, к сожалению, у меня ее нет.