最初に、私はこの質問に答えるのが遅いことに気づきました。
同期と非同期について説明する前に、プログラムの実行方法について簡単に説明します。
では、同期の場合、各ステートメントの完了、次のステートメントが実行される前に。この場合、プログラムはステートメントの順序で正確に評価されます。
これは非同期です、JavaScriptで機能するです。JavaScriptエンジンには2つの部分があります。1つはコードを調べて操作をエンキューする部分で、もう1つはキューを処理します。キューの処理は1つのスレッドで行われるため、一度に1つの操作しか実行できません。
非同期操作(2番目のデータベースクエリなど)が見られると、コードが解析されて操作がキューに入れられますが、この場合、この操作が完了すると実行されるようにコールバックが登録されます。キューにはすでに多くの操作が含まれている可能性があります。キューの先頭にある操作が処理され、キューから削除されます。データベースクエリの操作が処理されると、リクエストがデータベースに送信され、完了すると、完了時にコールバックが実行されます。この時点で、操作を「処理」したキュープロセッサは次の操作に移ります-この場合
console.log("Hello World");
データベースクエリはまだ処理中ですが、console.log操作はキューの先頭にあり、処理されます。これは同期操作であるため、すぐに実行され、すぐに「Hello World」という出力が生成されます。しばらくして、データベース操作が完了します。その後、クエリに登録されたコールバックが呼び出されて処理され、変数の結果の値が行に設定されます。
1つの非同期操作で別の非同期操作が発生する可能性があります。この2番目の操作はキューに入れられ、キューの先頭に来ると処理されます。非同期操作で登録されたコールバックの呼び出しは、JavaScriptランタイムが操作の完了時に操作の結果を返す方法です。
どのJavaScript操作が非同期であるかを知る簡単な方法は、コールバックが必要かどうかを確認することです。コールバックは、最初の操作が完了したときに実行されるコードです。問題の2つの例では、2番目のケースにのみコールバックがあることがわかります。したがって、これは2つの非同期操作です。非同期操作の結果を処理するスタイルが異なるため、常にそうであるとは限りません。
詳細については、約束をお読みください。Promiseは、非同期操作の結果を処理できるもう1つの方法です。promiseの良い点は、コーディングスタイルが同期コードに似ていることです。
ノード 'fs'のような多くのライブラリは、いくつかの操作に対して同期と非同期の両方のスタイルを提供します。操作に時間がかからず、頻繁に使用されない場合(構成ファイルを読み取る場合など)は、同期スタイルの操作により、コードが読みやすくなります。