Во-первых, я понимаю, что опоздал с ответом на этот вопрос.
Перед обсуждением синхронного и асинхронного, давайте кратко рассмотрим, как работают программы.
В синхронном случае каждое утверждение завершается до запуска следующего оператора. В этом случае программа оценивается именно в порядке заявлений.
Вот как асинхронный работает в JavaScript. В движке JavaScript есть две части: одна часть, которая просматривает код и ставит в очередь операции, а другая обрабатывает очередь. Обработка очереди происходит в одном потоке, поэтому одновременно может выполняться только одна операция.
Когда видна асинхронная операция (например, второй запрос к базе данных), код анализируется, и операция помещается в очередь, но в этом случае регистрируется обратный вызов для запуска после завершения этой операции. В очереди уже может быть много операций. Операция в начале очереди обрабатывается и удаляется из очереди. Как только операция для запроса к базе данных обработана, запрос отправляется в базу данных, и по завершении обратный вызов будет выполнен по завершении. В это время процессор очереди, «обработав» операцию, переходит к следующей операции - в этом случае
console.log("Hello World");
Запрос к базе данных все еще обрабатывается, но операция console.log находится в начале очереди и обрабатывается. Эта синхронная операция выполняется сразу же, что сразу приводит к выводу «Hello World». Через некоторое время операция базы данных завершается, и только после этого вызывается и обрабатывается обратный вызов, зарегистрированный в запросе, в результате чего значение переменной result устанавливается равным строкам.
Возможно, что одна асинхронная операция приведет к другой асинхронной операции, эта вторая операция будет помещена в очередь, и когда она поступит в начало очереди, она будет обработана. Вызов обратного вызова, зарегистрированного с помощью асинхронной операции, - это то, как среда выполнения JavaScript возвращает результат операции, когда она завершена.
Простой способ узнать, какая операция JavaScript является асинхронной, - это заметить, требует ли она обратного вызова - обратный вызов - это код, который будет выполнен после завершения первой операции. В двух примерах, приведенных в этом вопросе, мы видим, что только во втором случае есть обратный вызов, поэтому это асинхронная операция двух. Это не всегда так из-за разных стилей обработки результата асинхронной операции.
Чтобы узнать больше, прочитайте об обещаниях. Обещания - это еще один способ обработки асинхронной операции. Хорошая вещь об обещаниях состоит в том, что стиль кодирования больше похож на синхронный код.
Многие библиотеки, такие как узел 'fs', предоставляют как синхронные, так и асинхронные стили для некоторых операций. В случаях, когда операция не занимает много времени и не используется много - как в случае чтения файла конфигурации - операция синхронного стиля приведет к коду, который будет легче читать.