ディレクトリ
JSシングルスレッドモデル
JavaScriptがシングルスレッドで、言語を非ブロック、そこに一つだけのメインスレッドですが、1つのタスクのみを実行することができます。
jsが単純化するために、シングルスレッドを使用します
JSスタック、ヒープとメッセージキュー
スタック
これは、呼び出し元の関数のレコードに格納された - 呼び出しフレーム
ヒープ
これは、オブジェクトに格納されています
メッセージキュー
- 保留中のメッセージ・キューを含み、
- 各メッセージは、メッセージを処理するコールバック関数に関連付けられています。
イベントループ
イベントループイベントループとは何ですか
イベントループは、ループチェック機構であります
- メインスレッドがタスクを実行する場合、(非同期タスクと呼ばれているメッセージキュー内のjsタスク)の条件を満たすように、非同期メッセージキュータスクがあるかどうかを確認することになります。
- もしそうであれば、非同期タスクは、メインスレッドの同期タスクに移し、そしてその関連するコールバック関数を実行するようになります
- タスクはすべての上にタスクキューを実行することであれば、連続サイクル、プログラムが終了します。
メインスレッド
同期および非同期タスクのタスク
同期タスク
、メインスレッドでのタスクの実行キューを一時停止されていません
非同期タスク
タスクは、マクロとミクロのタスクに分割されています
マクロタスク
含む:
全体的なコードを含みますscript、setTimeout、setInterval、setImmediate、I/O、UI rendering
マイクロタスク
含みます:
promise.then, process.nextTick(node中)
マイクロタスクの前にマクロタスクの実行順序
プロセスイベントループ
メインスレッド同期タスクは空にした後、タスクの実行、この[マクロタスク]のための全コードとして最初の実装は、マイクロタスクリストをチェックすると、次につの実行によってメインスレッドのいずれかに追加空ではない場合、マイクロタスクリストの後に空、マクロタスクの実行、マイクロタスクリストの完了後にマクロタスクの実行が空でない場合、タスクマイクロ空になるまでマイクロタスクの実行に続いて、マクロタスクを実行し、これは、すべてのタスクリストに循環されたエンド・イベント・ループを空にする。
例:
console.log(1); //1.同步任务#1
setTimeout(function(){ //1.宏任务加入marcotask $1
console.log(2);
new Promise(function(resolve){
console.log(3);
setTimeout(function(){ //$3
console.log(4);
});
resolve();
}).then(function(){ //&2
console.log(5);
});
});
new Promise(function(resolve){ //1.promise 是同步任务!!!#2
console.log(6);
setTimeout(function(){ //1.加入宏任务队列 $2
console.log(7);
});
resolve();
}).then(function(){ //1.微任务加入microtask &1
console.log(8);
});
console.log(9); //1.同步任务#3
169823574の結果
- まず、#1は、同期タスクが発生した実行
setTimeout
に追加マクロタスク$ 1macrotask
満たさキュー、promise
同期タスク#2、直接実行するために、promise
実行が実行されsetTimeout
、マクロタスク$ 2、参加macrotask
会ったキュー、then()
マイクロタスクキュー、その後、同期タスク#3に参加することを、イベントループの第一の端部;
場合:出力結果[169]
。マクロタスク:$ 2 $ 1
マイクロタスク:. 1& - 1&マイクロタスク、タスク同期出力[8]、マイクロ空のキュー、実行マクロタスクを実行します
- 会った同期タスクの出力を実行するためのマクロタスク$ 1の実行、[2]、
promise
その同期タスクを実行するために、出力[3]、遭遇したsetTimeout
マクロタスク$ 3、参加macrotask
、会うthen()
&2、追加はmicrotask
$ 1マクロタスクが終了し、microtask
そう、空ではありません次は、マイクロタスクを実行します。 - マイクロタスクの実行タスクリスト:&2、出力[5]、キューの終わりは、ミクロ、マクロタスクの実行を空にした後
- $マクロ2タスク実行、出力[7]、実行終了
- $マクロ3タスクの実行、出力[4]、実行終了
- この時点で、すべてのキューは、イベントループの終わりを空にします。
要約:タスクを実行するための最初のマクロ、実行中のすべてのマイクロタスクなど。