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

小云云
リリース: 2018-03-26 16:33:23
オリジナル
4300 人が閲覧しました

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!