Javascript 操作メカニズム イベントループ

Javascript 操作メカニズム イベントループ

1. 4つのコンセプト

1. JavaScriptはシングルスレッドです

シングルスレッドとは、 jsコードを上から下まで同期的にしか実行できず、同時に実行できるタスクは 1 つだけであることを意味します。これにより、実行時間が長いタスクや実行時間が不確実なタスクが、他のタスクの正常な実行をブロックすることになります。 Event Loopが表示されるのは、この問題を解決するためです。

2. タスクキュー

上記のキューイング問題を解決するために、タスク キューが作成されます。ブラウザに結果を伴う非同期タスクがある場合、それは将来の実行のためにタスク キューに追加され、他のタスクはメイン スレッドで同期的に実行されます。

ここで注意すべき点は、タスク キューにタスクを追加するタイミングは、非同期タスクの結果が出た後であるということです。実際、タスク キューに存在するのは、非同期タスクのコールバック関数です。

3. 同期タスクと非同期タスク

Js プログラムにおける同期タスクはメインスレッドで実行されるタスクを指し、非同期タスクはタスクキューに入るタスクを指します。

4. JavaScript実行スタック

すべての同期タスクはメインスレッド上で実行され、実行スタックを形成します。メインスレッド上のタスクが完了すると、タスクはタスクキューから取り出されて実行されます。

var name = "zhouwei";

タイムアウトを設定する(() => {
    コンソールログ(1);
}, 1000);

console.log(名前);


上記のコードは、ブラウザでは次のように実行されます。プログラムのグローバル実行環境のコードは、main 関数にラップされたコードとして理解されます。このコードの実行スタックは、次の図に示すように変化します。

  • コードの実行を開始し、 mainタスク (実行のためにスタックにグローバル コード) をプッシュし、非同期タスクに遭遇したとき ( setTimeoutの後)。
  • ブラウザは非同期タスクを引き継ぎ、1 秒後に非同期タスクの結果 (コールバック関数) をタスク キューに追加します。
  • 実行スタック内の同期タスクが完了します。この時点で、タスク キューは空 (1 秒未満) であり、実行スタックも空です。
  • 非同期タスクは結果が出ると、まずタスク キューに入ります (非同期タスクが多数ある場合があるため)。
  • 実行スタックはタスクをタスク キューから取り出し、同期的に実行を開始します。
  • 手順 5 を繰り返します。

イベントループ

Js 実行スタックがタスク キューからタスクを継続的に読み取り、実行するプロセスをEvent Loop

タスク キューには非同期タスクの結果が格納されることはわかっていますが、非同期タスクとは何でしょうか?

  • 1. イベント

Javascriptには多くのイベントがありますが、それらはすべて非同期タスクです。ブラウザが引き継ぎます。イベントがトリガーされると、イベント コールバックがタスク キューに追加され、Js 実行スタックにタスクがない場合に実行されます。

  • 2. HTTPリクエスト
  • 3. タイマー
  • 4. requestAnimationFrameなど

macrotaskmicrotask
タスク キューとEvent Loopを理解した後、Js 実行スタックがタスク キューからタスクを読み取って実行することはわかりますが、この特定のプロジェクトについては明確ではありません。ここでは、イベント ループを理解するのに役立つマクロタスクとマイクロタスクの概念を紹介します。

タスクキューに入る非同期タスクコールバックは、マクロタスクとマイクロタスクに分けられます。マクロタスクとマイクロタスクを実行するための Js 実行スタックのルールを下図に示します。

Js 実行スタックは、最初にマクロ タスク (グローバル コード) を実行し、タスク キューからすべてのマイクロ タスクを読み取り、UI レンダリング (ブラウザー レンダリング インターフェイス) を実行し、タスク キューからマクロ タスクを読み取り、すべてのマイクロ タスクを実行し、UI レンダリングを実行し、…

イベント ループの各ラウンドが終了すると (1 つのマクロ タスク + すべてのマイクロ タスク)、ブラウザーはインターフェイスのレンダリングを開始します (レンダリングが必要な UI がある場合、それ以外の場合は UI レンダリングは実行されません)。UI UI rendering終了すると、イベント ループの次のラウンドが開始されます。

マクロタスクとは何ですか?

  • タイムアウトの設定
  • 間隔の設定
  • setImmediate (ノード)
  • requestAnimationFrame (ブラウザ)
  • I/O (イベントコールバック)
  • UIレンダリング(ブラウザレンダリング)

マイクロタスクとは何ですか?

  • 約束
  • process.nextTick (ノード)
  • MutationObserver (DOM の変更を検出するために最新のブラウザが提供する Web インターフェース)

setTimeout 遅延の問題

一般的に、コード内のsetTimeoutのコールバックの実行時間は、設定された時間よりも長くなります。 これは、 setTimeoutで指定された時間が経過した後、コールバック関数がタスク キューに追加されるものの、この時点で Js 実行スタックで実行中のタスクが存在する可能性があるためです。このコールバックは、Js 実行スタック内のタスクが完了するまで待機してから実行する必要があります。これがsetTimeout遅延問題です。

3. 実戦

次のコード出力を練習してください。

コンソールログ(1);

タイムアウトを設定する(() => {
    コンソールログ(2);
    Promise.resolve().then(() => {
        コンソール.log(3)
    });
});

新しいPromise(resolve => {
    コンソールログ(4);
    タイムアウトを設定する(() => {
        コンソールログ(5);
    });
    解決する(6)
})。次に、データ => {
    コンソールにログ出力します。
})

タイムアウトを設定する(() => {
    コンソール.log(7);
})

コンソールログ(8);

この質問を分析するには、上で説明した js 実行メカニズムを使用します。

1: グローバルタスクで同期コード出力を実行します。

1
4
8

ここで注意すべき点は、 Promiseが受け入れるhandle関数は同期タスクであるのに対し、 thenメソッドは非同期タスクであるため、4 が直接出力されることです。

2: この時点で、タスク キューには 3 つのsetTimeoutマクロ タスクと 1 つのPromiseマイクロ タスクがあります。

// この時点でのマクロタスクは setTimeout(() => {
    コンソールログ(2);
    Promise.resolve().then(() => {
        コンソール.log(3)
    });
});

タイムアウトを設定する(() => {
    コンソールログ(5);
});


タイムアウトを設定する(() => {
    コンソール.log(7);
})

// この時点で、マイクロタスクは then(data => {
    コンソールにログ出力します。
})

マイクロタスクを実行し、出力: 6

3: 最初のマクロタスクを実行します

タイムアウトを設定する(() => {
    コンソールログ(2);
    Promise.resolve().then(() => {
        コンソール.log(3)
    });
});


出力: 2

このマクロタスクでは、マイクロタスクがタスク キューに追加されます。この時点で、タスク キューには新しいマイクロタスクがあります。

4: マイクロタスクを実行し、出力: 3

それから(() => {
   コンソール.log(3)
});


5: ルールに従ってタスクの実行を継続します。出力: 5、7

全体的な出力は次のとおりです。

1、4、8、6、2、3、5、7

これがあなたの答えですか?

要約:

  • javascritpタスクは同期タスクと非同期タスクに分けられます
  • 同期タスクはメインスレッド (Js 実行スタック) で実行され、非同期タスクは他のスレッドに引き継がれ、非同期タスクに結果がもたらされた後、そのコールバックがタスク キューに追加されます。
  • タスク キュー内のタスクは、マクロタスクとマイクロタスクに分けられます。 Js 実行スタックは常に最初にマクロ タスクを実行し、次にすべてのマイクロ タスクを実行します...

Javascriptのイベント ループの動作メカニズムに関するこの記事はこれで終わりです。Javascript のイベント ループの動作メカニズムに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScriptの動作メカニズムの詳細な説明とイベントループについての簡単な説明
  • JavaScriptの動作の仕組みのイベントループ(Event Loop)の詳しい解説

<<:  MySQLでページングクエリを実装する方法

>>:  いくつかの CSS3 タグの短縮形 (推奨)

推薦する

MySQL GTID マスターとスレーブの不一致を修復するソリューション

目次解決策1: レプリカを再構築する前提条件アドバンテージ欠点手順マスター奴隷解決策2: データ修復...

Dockerとiptablesとブリッジモードのネットワーク分離と通信操作の実装

Docker は、ブリッジ、ホスト、オーバーレイなどの複数のネットワークを提供します。同じ Dock...

mysql8.0.11をインストールしてrootパスワードを変更し、navicat for mysqlに接続するアイデアの詳細な説明

1.1. ダウンロード:公式ウェブサイトから zip パッケージをダウンロードします。私は 64 ビ...

Bootstrap 3.0 学習ノート CSS関連補足

この記事の主な内容は次のとおりです。 1. ブラウザのサポート2. 画像3. レスポンシブツール4....

数百万のデータボリュームに対する MySQL ページングクエリ方法とその最適化の提案

データベース SQL の最適化はよくある問題です。何百万ものデータ ボリュームに対してページング ク...

便利でシンプルなMySQL関数10個

関数0. 現在の時刻を表示するコマンド: select now()。機能: 現在の時刻を表示します。...

MySQL カーソル関数と使用法

目次意味カーソルの役割カーソルの使用カーソルの宣言カーソルを開くカーソルデータのトラバースカーソルを...

MySQL 5.7.17 のインストールと設定方法のグラフィック チュートリアル (Windows)

1. ソフトウェアをダウンロードする1. MySQL の公式サイトにアクセスし、Oracle アカ...

CSS が複数のクラスに一致する方法のサンプルコード

CSSは複数のクラスにマッチする次の HTML タグ li、クラスはオープン スタイルです。私の要件...

Vueログイン機能の実装

目次前面に書かれたログインの概要ログインビジネスプロセスログインサービスの関連技術ポイントログイント...

MySQL遅延スレーブを導入するメリットのまとめ

序文MySQL のマスター/スレーブ レプリケーション関係は、厳密には「同期」または「マスター/スレ...

MySQL information_schema データベースの詳細な説明

1. 概要information_schema データベースは performance_schema...

::before/:before と ::after/:after の使用に関する深い理解

パート1: 基礎1. :active や :hover などの疑似クラスとは異なり、これらはすべて疑...

Ubuntu 18.04の下のディレクトリにディスクをマウントします

導入この記事では、Ubuntu 18.04 デスクトップ システムでディスクを目的のディレクトリにマ...