プログラミングの分野では、コールバックは非同期実行において重要な役割を果たします。コールバックが非同期で動作することは広く理解されていますが、この動作の背後にある根本的なメカニズムは多くの人にとって不明のままです。この記事では、コールバック ベースのプログラミングで非同期実行を可能にする構文と実装の詳細について詳しく説明します。
一般的な考えに反して、関数が非同期で実行されるかどうかを決定する特定の構文要素はありません。または同期的に。コールバックは、次の場合に示すように、どちらのモードでも機能します。
非同期:
setTimeout(function(){ console.log("this is async"); }, 100);
同期:
an_array.forEach(function(x){ console.log("this is sync"); });
JavaScript 自体には、関数の非同期実行のための固有のメカニズムがありません。この動作を実現するには、次の 2 つのアプローチのいずれかを実行できます。
setTimeout などの C コード関数は、非同期を容易にする高度な技術に依存しています。実行。関与する主なメカニズムはイベント ループです。
すべての Web ブラウザの中核には、イベント ループ (残り物) があります。インターネットの初期に登場した非同期ネットワーキング プロトコル。このメカニズムにより、ブラウザは追加のスレッドに頼ることなく、複数の I/O リクエストを同時に処理できるようになります。
イベント ループは、select() (または類似のバリアント) として知られる C の重要なシステム コールに依存します。
select (max, readlist, writelist, errlist, timeout)
select() を使用すると、システムは多数の I/O 操作を同時に監視できます。選択した I/O チャネルのいずれかでデータが利用可能になると、関数が戻り、ブラウザに適切なコールバック実行を開始するよう通知します。
コールバック関数が登録されると、JavaScript インタープリターはそれを保存し、同時に select() 関数を呼び出します。インタープリターが返されると、インタープリターはコールバックを特定の I/O チャネルに関連付け、その実行をトリガーします。
select() により、ブラウザーはタイムアウトを通じてコールバックの呼び出しタイミングを制御することもできます。 select() に渡されるタイムアウト引数を細心の注意を払って調整することで、コールバックの実行を所定の間隔でスケジュールできます。これは、setTimeout や setInterval などの関数の基礎を形成します。
イベント ループとは別に、Web ブラウザーは Web ワーカーを使用して、別のスレッドでの JavaScript コードの非同期実行を容易にします。ただし、これらのワーカーは、メイン スレッドに通信するために、select() を介してメイン イベント ループと相互接続する必要があります。
Node.js は、Web ブラウザと同様に、ファイル/ディスク I/O 操作にスレッドを利用します。これらのタスクが完了すると、スレッドは Node.js イベント ループと通信し、関連するコールバックの実行を促します。
以上がJavaScript は実際にどのようにしてコールバックを非同期にするのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。