ブラウザでのjsのイベントループイベントキューの詳細な説明

ブラウザでのjsのイベントループイベントキューの詳細な説明

序文

以下の内容はブラウザ上でのjsのイベントキュー実行であり、nodejsでのそれとは異なりますので、ご注意ください。

js はシングルスレッドと言われますが、実際にはシングルスレッドではありません。ただし、ブラウザで実行される場合は、実行用に 1 つのスレッドのみが割り当てられます。

したがって、js の実行はシングルスレッドであり、一度に 1 つのタスクしか実行できません。つまり、一度に 1 つのタスクが実行され、1 つのタスクが完了した後に次のタスクが実行されます。

スタックと2つのキューを理解する

呼び出しスタック スタック。

マクロ キュー、マクロタスク (タスクとも呼ばれます)。

マイクロキュー、マイクロタスク、ジョブとも呼ばれます。

実行プロセス

js はグローバル スクリプト同期コードを実行します。このプロセス中に非同期タスクが発生した場合は、まず対応するキューに追加されます。

これが完了すると、呼び出しスタックは空になります。

次に、キューの最初のタスク (最初はマイクロ キュー、次にマクロ キュー) が、キュー内のすべてのタスクが完了するまで 1 つずつ、実行するためにコール スタックに移動されます。

要約すると、最初に同期タスクを実行し、次にマイクロキュー タスクを実行し、最後にマクロキュー タスクを実行します。

非同期タスクを割り当てる方法

これらの非同期タスクには、以下のものが含まれますが、これらに限定されません。

マクロ キューには次のものが割り当てられます。

タイムアウトの設定
間隔の設定
リクエストアニメーションフレーム
入出力
UIレンダリング

マイクロキューには次のものが割り当てられます。

約束
オブジェクト.観察
ミューテーションオブザーバー

一般的なマクロ キュー: setTimeout、一般的なマイクロ キュー: Promise。

簡単な例

    console.log("同期タスク1");

    タイムアウトを設定する(() => {
      console.log("マクロタスク");
    });

    新しい Promise((resolve, 拒否) => {
      console.log("同期タスク2");
      解決("マイクロタスク");
    }).then((データ) => {
      コンソールにログ出力します。
    });

    console.log("同期タスク3");

結果は次のようになります (番号でタスクを追加し、矢印で実行します)。

コールバックが実行される前に、Promise の最初のレイヤーが同期されていることに注意してください。これは、上記の同期タスク 2 です。

より難しい例

    console.log("同期タスク1");

    console.log("同期タスク2");

    新しい Promise((resolve, 拒否) => {
      console.log("同期タスク3");
      タイムアウトを設定する(() => {
        console.log("マクロタスク1");
        Promise.resolve()
          .then(() => {
            console.log("マイクロタスク 5");
          })
          .then(() => {
            console.log("マイクロタスク 6");
          });
      });
      解決します("マイクロタスク 1");
    })
      .then((データ) => {
        コンソールにログ出力します。
        「マイクロタスク 3」を返します。
      })
      .then((データ) => {
        コンソールにログ出力します。
      });

    タイムアウトを設定する(() => {
      console.log("マクロタスク2");
    }, 0);

    新しい Promise((resolve, 拒否) => {
      解決します("マイクロタスク 2");
    })
      .then((データ、解決) => {
        コンソールにログ出力します。
        「マイクロタスク 4」を返します。
      })
      .then((データ) => {
        コンソールにログ出力します。
      });

    console.log("同期タスク4");

どのように表示するか? まず最初のレイヤーを見てください。赤は同期、緑はマイクロタスク、青はマクロタスクを表します。

同期タスクを完了すると、2 つのマイクロタスクと 2 つのマクロタスクがあることがわかります。

元の実行順序は次のようになります (ここではシリアル番号に従って順序を表現しています。単純な例と区別してください)。

しかし、それはそれほどスムーズではなく、6番になると状況は変わりました。

マイクロタスクの実行中に新しいマイクロタスクが生成される可能性があるためです。

上記のマイクロタスク 1 の実行後、マイクロタスク 2 の後にマイクロタスク 3 が追加されます。つまり、マイクロタスク 2 の実行後はマクロタスクの順番にはなりません。マイクロタスク キューが一時的に空になるまで、新しいマイクロタスクが実行され続けます。

したがって、4 つのマイクロタスクはキューに追加された順序で実行されます。この時点で、新しいマイクロタスクが生成されない場合は、マクロタスクが実行されます。

ただし、上記を5番まで実行すると状況が異なります。マクロタスクの実行後、新しいマイクロタスクが生成されます。そのため、2つのマクロタスクはスムーズに連続して実行されるのではなく、挿入されたマイクロタスクによってブロックされます。

(マイクロタスク キューとマクロタスク キューの両方が存在する場合、マクロタスクの実行によってマイクロタスクが生成されたとしても、マクロタスクの前にマイクロタスクを実行する必要があることに注意してください。)

したがって、最終的な答えがわからない場合は、上記を注意深く確認してください。

要約する

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

以下もご興味があるかもしれません:
  • JavaScriptの動作の仕組みのイベントループ(Event Loop)の詳しい解説
  • フロントエンドJSのイベントループメカニズムの詳細な説明
  • JavaScript の EventLoop 入門
  • JS イベントループの仕組み イベントループ マクロタスク マイクロタスク 原理分析
  • JavaScript イベントループ関連原則の分析

<<:  IE8はマルチ互換モードを使用してWebページを正常に表示します

>>:  mysql 行列変換サンプルコード

推薦する

Windows 10 でカスタムドメイン名をバインドするように Hexo と GitHub を構成する方法

Hexo は Windows 10 でカスタムドメイン名を GitHub にバインドしますまずドメイ...

ブラウザが登録できるイベントの概要

HTML イベント リスト一般イベント: onClick HTML: マウスクリックイベント。主にオ...

Windows 10 で MySQL 8.0.12 の解凍バージョンをインストールして構成する方法 (グラフィック チュートリアル付き)

この記事では、MySQL 8.0.12 の解凍版のインストールと設定方法を記録し、皆様と共有します。...

MySQL 接続とコレクションの簡単な分析

結合クエリ結合クエリとは、2 つ以上のテーブル間のマッチング クエリを指し、一般的には水平操作と呼ば...

MySQL で置換操作を使用したときにデータ損失が発生する問題の解決策

序文同社の開発者は、データの更新時に replace into ステートメントを使用していました。不...

jQueryは広告の表示と非表示のアニメーションを実装します

数秒後に広告が表示されて消えることがよくあります。この機能を実装するには、JQuery フレームワー...

JavaScript でプライベート変数を宣言する 2 つの方法

序文JavaScript は、キーワードを使用してプライベート変数を宣言できる他の言語とは異なります...

MySQL で lower_case_table_names を記録する際の落とし穴の詳細な説明

1 原因プロジェクトがデータベースを移行して再起動した後、「T_AAAテーブルが存在しません」という...

mysql5.7.21.zip インストールチュートリアル

mysql5.7.21 zipの詳細なインストール手順は次のとおりです。 1. 解凍して指定されたデ...

HTML テーブルタグチュートリアル (24): 行の水平方向の配置属性 ALIGN

水平方向では、行の配置を左、中央、右に設定できます。基本的な構文<TR ALIGN="...

ウェブページで Enter キーを押すと自動的にフォームを送信し、他のページにジャンプするソリューション

ウェブページでEnterキーを押すと、フォームは自動的に送信され、他のページに移動します。クエリフォ...

VUEは底部吸引ボタンを実装

この記事では、VUEの具体的なコードを共有して、下部吸引ボタンを実装する例を紹介します。具体的な内容...

Docker の MySQL コンテナのタイムゾーン問題の修正

序文Ahhang が Springboot プロジェクトを開発していたとき、フロントエンドから検証コ...

Vueのレスポンシブシステムの原理の詳細な説明

目次Vueのレスポンシブシステムの基本原則1. Object.definePropertyの使い方を...

Vueはログインタイプの切り替えを実装します

この記事では、ログインタイプの切り替えを実装するためのVueの具体的なコードを例として紹介します。具...