Po pierwsze, zdaję sobie sprawę, że spóźniłem się z odpowiedzią na to pytanie.
Zanim omówimy synchroniczne i asynchroniczne, przyjrzyjmy się pokrótce, jak działają programy.
W przypadku synchronicznym każda instrukcja kończy się przed uruchomieniem następnej instrukcji. W takim przypadku program jest oceniany dokładnie w kolejności instrukcji.
Tak działa asynchroniczny w JavaScript. Mechanizm JavaScript składa się z dwóch części, z których jedna przegląda kod i kolejkuje operacje, a druga przetwarza kolejkę. Przetwarzanie kolejki odbywa się w jednym wątku, dlatego jednocześnie może wystąpić tylko jedna operacja.
Gdy widoczna jest operacja asynchroniczna (jak drugie zapytanie bazy danych), kod jest analizowany, a operacja umieszczana w kolejce, ale w tym przypadku rejestrowane jest wywołanie zwrotne do uruchomienia po zakończeniu tej operacji. W kolejce może być już wiele operacji. Operacja z przodu kolejki jest przetwarzana i usuwana z kolejki. Po przetworzeniu operacji na zapytanie do bazy danych żądanie jest wysyłane do bazy danych, a po zakończeniu wywołanie zwrotne zostanie wykonane po zakończeniu. W tej chwili procesor kolejek, który „obsłużył” operację, przechodzi do następnej operacji - w tym przypadku
console.log("Hello World");
Zapytanie do bazy danych jest nadal przetwarzane, ale operacja console.log znajduje się z przodu kolejki i jest przetwarzana. Ta operacja synchroniczna jest wykonywana natychmiast, co powoduje natychmiastowe wyświetlenie wyniku „Hello World”. Jakiś czas później operacja bazy danych jest zakończona, dopiero wtedy wywołanie zwrotne zarejestrowane w zapytaniu jest wywoływane i przetwarzane, ustawiając wartość wyniku zmiennej na wiersze.
Możliwe, że jedna operacja asynchroniczna spowoduje kolejną operację asynchroniczną, ta druga operacja zostanie umieszczona w kolejce, a jeśli dojdzie do przodu kolejki, zostanie przetworzona. Wywołanie wywołania zwrotnego zarejestrowanego w operacji asynchronicznej jest sposobem, w jaki czas działania JavaScript zwraca wynik operacji po jej zakończeniu.
Prostą metodą sprawdzenia, która operacja JavaScript jest asynchroniczna, jest zwrócenie uwagi, czy wymaga ona wywołania zwrotnego - wywołanie zwrotne to kod, który zostanie wykonany po zakończeniu pierwszej operacji. W dwóch przykładach w pytaniu widzimy, że tylko drugi przypadek ma wywołanie zwrotne, więc jest to asynchroniczna operacja dwóch. Nie zawsze tak jest z powodu różnych stylów obsługi wyniku operacji asynchronicznej.
Aby dowiedzieć się więcej, przeczytaj o obietnicach. Obietnice to kolejny sposób, w jaki można obsłużyć wynik operacji asynchronicznej. Zaletą obietnic jest to, że styl kodowania przypomina bardziej kod synchroniczny.
Wiele bibliotek, takich jak węzeł „fs”, udostępnia style synchroniczne i asynchroniczne dla niektórych operacji. W przypadkach, gdy operacja nie trwa długo i nie jest często używana - jak w przypadku odczytu pliku konfiguracyjnego - operacja synchroniczna spowoduje, że kod będzie łatwiejszy do odczytania.