【16】Windows再学習の先端-JavaScript実行(一):Promise内のコードはなぜsetTimeoutより先に実行されますか?
2008 ワード
jsは非同期のいくつかの形式を実現します.コールバック関数 イベント傍受-イベント駆動モード リリース/購読-観察者モード Promisesオブジェクト js非同期の歴史 JavaScriptエンジンはメモリに常駐しています.JavaScriptコードまたは関数を伝えて を実行するのを待っています.はES 3ともっと早いバージョンの中で、JavaScript自身はまだ例外的にコードを実行する能力がなくて、エンジンはコードを直接順次実行して、この任務は宿主の発起する任務です. はES 5の後に、JavaScriptがPromiseを導入しました.このように、ブラウザの手配は不要です.JavaScriptエンジン自体も任務を開始することができます. 巨視的任務マクロタスク:宿主が開始したタスクは、各セグメントjsコードの実行プロセスは、実際にはマクロタスクです. マイクロタスク:JavaScriptエンジンが開始するタスク-JSエンジンレベル 関係:マクロタスクの各キューを維持するためには、JavaScriptのPromiseが非同期コードを生成します.JavaScriptは、これらの非同期コードがマクロタスクの中で を完了することを保証しなければなりません.例 Promiseは、常に列の最後に微視的タスクを追加します. setTimeoutなどのホストAPIは、マクロタスク を追加します.
実行順序: マイクロタスク:所属するマクロタスクキューのすべての同期タスクを実行した後、 を実行します.マクロタスク:マクロタスクのトリガルールと呼び出し順序 eg:1秒間のPromiseを実行します.1秒のc 1実行が完了しても、enqueのc 2は、dより先に実行されます.これは、タスク優先の原理をよく説明します.
イベントサイクル 定義:JavaScriptエンジンは、ホスト環境がマクロタスクを割り当てるのを待っています.オペレーティングシステムでは、通常待つ行為はイベントサイクルです.つまり、繰り返し「待つ」 です.機能:ループが終了するかどうか、マクロタスクキューなどの論理 を判断する.
は、非同期実行の順序をどのように分析しますか? まず、いくつかのマクロタスクがあるかを分析します. マクロタスクごとに、いくつかのマイクロタスクを分析します. は、呼び出し順序に従って、マクロタスクにおけるマイクロタスクの実行順序を決定する. マクロタスクのトリガルールと呼び出し順序に従って、マクロタスクの実行順序を決定する .は、全体の順序を決定します. eg:setTimeoutはコード全体を2つのマクロタスクに分割しました.ここでは5秒でも0秒でも同じです.最初のマクロタスクには、先着同期して実行されるconsolie.log(a)と、consolie.log(b)が含まれています.set Timeout後、第二のマクロタスクの実行は、resoliveを呼び出してから、thenのコードは非同期的に実行されるので、consolone.log(c)を呼び出して、最終的に出力する順序はaであり、b、c である.
イベントサイクル
setTimeout(()=>console.log("d"), 0)
var r1 = new Promise(function(resolve, reject){
resolve()
});
r.then(() => {
var begin = Date.now();
// 1 , , c2 setTimeout d
while(Date.now() - begin < 1000);
console.log("c1")
new Promise(function(resolve, reject){
resolve()
}).then(() => console.log("c2"))
});