JavaScript の実行を理解する: setTimeout と Promises を使用して同期動作と非同期動作を判断する

JavaScript の実行を理解する: setTimeout と Promises を使用して同期動作と非同期動作を判断する
JavaScript の実行を理解する: setTimeout と Promises を使用して同期動作と非同期動作を判断する

JavaScript によるコードの実行方法を理解する: 同期パターンと非同期パターン

JavaScript はシングルスレッド言語です。つまり、一度に 1 行のコードを実行します。同期タスクと非同期タスクの両方をどのように処理するかを理解することは、開発者にとって重要です。技術面接ではこのトピックに関する質問がよく出てくるため、これらの概念を徹底的に把握することが重要です。

開発者が次のような関数を使用するとき setTimeout または 約束, 実行フローは、最初は少し予測できないように見えるかもしれません。ただし、明確な構造に従うことで、コードのさまざまな部分が実行される正確な順序を決定できます。これは、次のような問題に対処する場合に特に重要です。 コールバック そして イベントキュー

この例では、JavaScript が次のような同期タスクをどのように処理するかを詳しく説明します。 コンソール.ログ そして、次のような非同期操作 setTimeout そして 約束。この説明を終えると、JavaScript のイベント ループがどのようにタスクに優先順位を付けて処理するかをより明確に理解できるようになります。

この記事は、JavaScript の実行順序を決定するのに役立つように設計されています。これは、面接の質問に取り組んだり、非同期コードをデバッグしたりするときに役立つスキルです。概念を明確に示すために実際の例を見てみましょう。

指示 使用例
setTimeout() この関数は、指定された遅延の後にコードの実行をスケジュールします。これは、アクションの遅延やイベント ループへの操作の延期など、非同期タスクをシミュレートするために使用されます。例では、ロギング「B」と「E」の実行を遅らせるために使用されます。
Promise.resolve() すぐに解決される Promise を作成します。これは、非同期コードを実行する必要があるが、外部条件を待つ必要がない場合に便利です。この例では、「B」の後に「D」を非同期的に記録するために使用されています。
then() このメソッドは、Promise が解決されたときに実行されるコールバックを Promise にアタッチします。これにより、非同期タスクの完了後に特定のコードが確実に実行されます。ここでは、解決された Promise の後に「D」が記録されるようにします。
Event Loop イベント ループは、JavaScript で非同期タスクの実行を処理するメカニズムです。直接的にはコマンドではありませんが、その機能を理解することは、コード内の操作の順序を説明する上で重要です。現在のスタックがクリアされた後、コールバック キューからタスクを処理します。
Microtask Queue これは、解決された Promise などのタスクの優先キューです。マイクロタスク (解決された Promise など) は、イベント ループのタスク キューからのタスク (setTimeout コールバックなど) の前に実行されます。これが、「D」が「E」より前にログに記録される理由です。
Console.log() デバッグ目的でコンソールにメッセージを出力するために使用されます。このコンテキストでは、同期コードと非同期コードが実行される順序を追跡するのに役立ちます。
Callback Queue コールバック キューには、setTimeout に渡される関数など、現在のコードの実行終了後に実行する準備ができているタスクが格納されます。イベント ループは、これらのタスクをコール スタックに移動します。
Zero Delay setTimeout() 遅延が 0 に設定されている場合、コールバックはすべての同期タスクとマイクロタスクが完了した後に実行されます。この例では、遅延が 0 であっても、「E」のコールバックは「D」の後に実行されます。
Asynchronous Execution これは、特定の操作がメイン コード フローとは別に実行されるプログラミング パラダイムで、JavaScript がメイン スレッドをブロックすることなくネットワーク リクエストやタイマーなどのタスクを処理できるようにします。

JavaScript 実行フローの探索: 同期コードと非同期コード

JavaScript では、同期コードと非同期コードの実行順序を理解することが重要であり、特に次の処理を行う場合には重要です。 setTimeout そして 約束。理解すべき重要な概念は、イベント ループが最初に同期タスクを処理し、次にキューに入れられた非同期タスクの処理に進む方法です。提供されているコード例では、最初の 2 つのログ (「A」と「F」) は同期しています。つまり、コード内に出現する順序とまったく同じ順序で実行されます。スクリプトは、実行されるとすぐに、後の処理のために setTimeout などの非同期タスクをスケジュールします。

setTimeout 関数は操作を延期する一般的な方法であり、実行フローに遅延感を生み出します。この場合、両方とも setTimeout 関数は、コンソール ログ「B」および「E」をイベント キューに追加するために使用されます。 「E」の遅延は 0 ミリ秒ですが、現在の同期操作とマイクロタスクが完了した後もキューに入れられることに注意することが重要です。この微妙な違いを理解することは、より複雑な JavaScript タスクの実行順序を決定する際に重要です。

最初の内側 setTimeout コールバックでは、ログ「B」がまだ同期タスク キューの一部であるため、ログ「B」が最初に出力され、優先されます。次に、そのコールバック内で、解決された Promise が作成されます。 約束する、解決する。これにより、ログ「D」が「B」の後、メイン イベント キュー内の他のタスクの前に発生するようにするマイクロタスクがトリガーされます。マイクロタスク キューに配置される Promise のこの動作により、2 番目の setTimeout コールバックが "E" を記録する前に "D" が記録されるようになります。したがって、マイクロタスクは標準の非同期タスクよりも優先されます。

最終的な実行順序を要約すると、「A」と「F」が同期的にログに記録され、続いて「B」が最初の setTimeout によってキューに入れられます。解決された Promise により、次に「D」がマイクロタスクとして記録されます。最後に、「E」は 2 番目の部分であるため最後に記録されます。 setTimeout 折り返し電話。同期タスク、イベント ループ、マイクロタスクを組み合わせた JavaScript の実行フローを理解することは、面接の質問に答えたり、実際のプロジェクトで非同期コードをデバッグしたりするときに非常に役立ちます。

さまざまなシナリオにおける JavaScript の同期実行と非同期実行を理解する

このスクリプトは、同期操作と非同期操作を組み合わせて使用​​する JavaScript のイベント ループ メカニズムを示します。

console.log("A");
setTimeout(() => {
    console.log("B");
    Promise.resolve("C").then(() => console.log("D"));
}, 1000);
setTimeout(() => console.log("E"), 0);
console.log("F");

JavaScript 実行の分析: イベント ループに焦点を当てる

この例は前の例を基にして、イベント ループがさまざまなタイミング シナリオでキューに入れられたタスクを処理する方法を示します。

console.log("Start");
setTimeout(() => {
    console.log("Middle");
}, 500);
Promise.resolve().then(() => {
    console.log("Promise 1");
});
console.log("End");

JavaScript のイベント ループとタスクの優先順位付けについて詳しく知る

JavaScript の非同期動作の重要な側面は、 イベントループ、コールバック、Promise、およびその他の非同期コードの実行を処理します。このイベント ループは、コール スタックが空かどうかを常にチェックし、空であれば、コールバック キューとマイクロタスク キューからタスクを処理します。これらのキュー内でタスクの優先順位がどのように設定されているかを理解することは、特に処理時にコードが期待どおりに動作することを保証するために重要です。 setTimeout そして同時に約束する。

マイクロタスク キューはコールバック キューよりも優先されます。のようなタスク 約束の解決 つまり、setTimeout の遅延がゼロであっても、コールバック キューからの遅延タスクよりも前に実行されます。コード例では、Promise のログ「D」が 2 番目の setTimeout のログ「E」より前に実行されるのはこのためです。予期しない動作を避けるために、非同期操作を混合するコードを作成する場合、開発者がこのことを理解することが重要です。

実際のアプリケーションでは、API 呼び出しやタイマーなどの非同期操作が同期コードと頻繁にやり取りされます。イベント ループ、コールバック キュー、マイクロタスク キューがどのように機能するかを知ることで、開発者はコードの結果をより正確に予測できるようになります。これは、パフォーマンスの最適化や複雑なスクリプトのデバッグを行う場合に特に重要です。 非同期操作 と同期コードは頻繁に相互作用します。

JavaScript の実行順序に関するよくある質問

  1. JavaScriptのイベントループとは何ですか?
  2. イベント ループは、JavaScript が非同期操作の実行を管理し、優先順位を付けるために使用するメカニズムです。 setTimeout または Promises
  3. どのようにして setTimeout 仕事?
  4. setTimeout 指定された遅延の後にコールバックが実行されるようにスケジュールしますが、コールバックはコールバック キューに入れられ、すべての同期コードとマイクロタスクが処理された後にのみ実行されます。
  5. なぜ Promise 前に解決する setTimeout 遅延は 0 ですか?
  6. Promise はマイクロタスク キューに配置され、コールバック キューよりも優先されます。 setTimeout コールバックが配置されます。
  7. コールバック キューとマイクロタスク キューの違いは何ですか?
  8. コールバック キューは次の目的で使用されます。 setTimeout およびその他の非同期操作、マイクロタスク キューは次のようなタスクを処理します。 Promise 解決し、コールバックの前に処理します。
  9. 実行順序は何ですか console.log 提供された例のステートメントは?
  10. イベント ループによる同期タスクと非同期タスクの処理方法により、順序は「A」、「F」、「B」、「D」、「E」になります。

JavaScript の実行モデルのまとめ

JavaScript のイベント ループを理解することは、JavaScript のイベント ループを理解することが重要です。 非同期 のような操作 setTimeout そして 約束 が実行されます。これは、開発者がコードが期待どおりに動作することを確認し、複数のタスクを処理するときによくある落とし穴を回避するのに役立ちます。

この例では、「A」、「F」、「B」、「D」、および「E」の最終実行順序は、マイクロタスク (Promises) が setTimeout からのコールバックよりもどのように優先されるかを示しています。この知識は、面接での質問や実際のコーディングの課題において非常に貴重です。

JavaScript の実行順序に関する参考文献とソース
  1. JavaScript におけるイベント ループとタスクの優先順位付けの概念について詳しく説明します。 MDN Web ドキュメント - イベント ループ
  2. の行動について議論します 約束 そして setTimeout 非同期 JavaScript コード実行時。 JavaScript 情報 - マイクロタスク キュー
  3. JavaScript の例を使用して、同期タスクと非同期タスクの実行順序を説明します。 freeCodeCamp - JavaScript の約束を理解する