По-перше, я усвідомлюю, що спізнююсь відповісти на це питання.
Перш ніж обговорити синхронні та асинхронні, давайте коротко розглянемо, як працюють програми.
У синхронному випадку кожне твердження завершується до запуску наступного оператора. У цьому випадку програма оцінюється точно в порядку тверджень.
Так працює асинхронність у JavaScript. У двигуні JavaScript є дві частини, одна частина, яка розглядає код і запитує операції, а інша, яка обробляє чергу. Обробка черги відбувається в одному потоці, тому одночасно може відбуватися лише одна операція.
Коли видно асинхронну операцію (як-от другий запит до бази даних), код аналізується і операція ставиться в чергу, але в цьому випадку реєструється зворотний виклик, який буде запущений після завершення цієї операції. У черзі вже може бути багато операцій. Операція в передній частині черги обробляється і видаляється з черги. Після того, як операція з запитом до бази даних буде оброблена, запит надсилається до бази даних, і коли завершення зворотного дзвінка буде виконано після завершення. В цей час процесор черги, який "обробив" операцію, переходить до наступної операції - у цьому випадку
console.log("Hello World");
Запит на базу даних все ще обробляється, але операція console.log знаходиться на передній частині черги та отримує обробку. Ця синхронна операція виконується негайно, що призводить негайно до виводу "Hello World". Через деякий час операція з базою даних завершується, тільки тоді зворотний виклик, зареєстрований запитом, викликається і обробляється, встановлюючи значення змінної результату на рядки.
Можливо, що одна асинхронна операція призведе до іншої асинхронної операції, ця друга операція буде поставлена у чергу, а коли вона надійде до передньої частини черги, вона буде оброблена. Виклик зворотного дзвінка, зареєстрованого асинхронною операцією, - це те, як час запуску JavaScript повертає результат операції, коли вона виконана.
Простий метод визначити, яка операція JavaScript є асинхронною, - зазначити, якщо вона вимагає зворотного дзвінка - зворотний виклик - це код, який буде виконуватися після завершення першої операції. У двох прикладах у питанні ми бачимо, що лише у другому випадку є зворотний виклик, тож це асинхронна операція обох. Це не завжди так через різні стилі обробки результатів асинхронної операції.
Щоб дізнатися більше, читайте про обіцянки. Обіцяння - це ще один спосіб вирішення результатів асинхронної операції. Приємне в обіцянках полягає в тому, що стиль кодування більше схожий на синхронний код.
Багато бібліотек, як вузол 'fs', надають як синхронний, так і асинхронний стилі для деяких операцій. У випадках, коли операція не займає багато часу і не використовується дуже багато - як у випадку зчитуванням конфігураційного файлу - операція синхронного стилю призведе до коду, який легше читати.