ホームページ  >  記事  >  ウェブフロントエンド  >  JSイベントポーリングメカニズムの説明

JSイベントポーリングメカニズムの説明

小云云
小云云オリジナル
2018-03-26 16:33:234267ブラウズ

JS はシングルスレッド言語です。この記事では主に JS のイベント ポーリング メカニズムについて説明します。

JSの実行メカニズム(1):

1. まず、JSが同期か非同期かを決定し、同期はイベントテーブルに入ります

2. 非同期タスクはイベントテーブルに関数を登録します。トリガー条件が満たされると、最後にイベント キューにプッシュされます

3. メイン スレッドに入った後、同期タスクが実行されます。メイン スレッドがアイドル状態になるまで、実行可能ファイルがあるかどうかを確認するためにイベント キューに移動します。非同期タスクがある場合はメインプロセスにプッシュされます

JSの実行メカニズム(2)

1. プロセス中にマイクロタスクが発生した場合、それを[イベントキュー]に入れます。マイクロタスク

2. 現在のマクロタスクの実行が完了したら、マイクロタスクの[イベントキュー]を確認し、その中のすべてのマイクロタスクを順番に実行します

タスク分割方法:

1.macro-task (マクロタスク): script, setTimeout, setInterval

2.micro-task(Microtask): Promise, process.nextTick

小さな疑問からスタート

for (var i=0;i<=5;i++){
    setTimeout(()=>{console.log(i)},1000)
}

出力結果は、1sの後に6が連続して6つ出力されるはずです。この質問の主な知識ポイントはブロック レベルのスコープですが、イベント ポーリング メカニズムの導入に非常に適しています。 setTimeout は非同期タスクであるため、すべての同期タスクが実行されるまで待つ必要があります。つまり、i が 6 になると、同時に 6 つのタイマーの実行が開始されます。時間、i は 6. 変数のグローバル値を指しているので、6 を出力します。これは JS 実行メカニズム (1) です

さらに難しくするために、JS 実行メカニズム (2) を考慮してください

// promise里面的函数是立即执行的// 分别输出 2 3 5 4 1setTimeout(function () {
    console.log(1)
},0);new Promise(function executor(resolve) {
    console.log(2);    for(var i=0;i<10000;i++){
        i==9999 && resolve();
    }
    console.log(3);
}).then(function () {
    console.log(4);
});
console.log(5);

最初のマクロ タスクが実行されましたはスクリプトである必要があるため、(実行を何秒遅らせても) タイマーがジャンプされ、Promise のコンテンツが順番に実行され、最初に 2 が出力され、次に for ループが実行されます。非同期コールバック関数。これは非同期実行に属します。同時に、タスク内にいる場合は、分割で述べたように、Promise はマイクロタスクであるため、マクロタスクの終了後にマイクロタスクのイベント キューがクリアされるため、3、5 になります。 、次に 4 が出力されます。

この時点で、最初のマクロタスクが処理され、次にタイマーの番になります。

以上がJSイベントポーリングメカニズムの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:jsとjqの比較例次の記事:jsとjqの比較例