(flags)毎日の面接問題-JavaScript実行メカニズム、マクロタスク、マイクロタスク
2967 ワード
JavaScript実行メカニズム、マクロタスク、マイクロタスク1.jsは、1つのスレッド言語ブラウザがマルチスレッドである2.同期してメインスレッド3に入ります.非同期にEvent Tableに入り、関数を登録します.指定されたことが完了すると、Event Tableはこの関数をEvent Queに移動します.メインスレッドのタスクを実行した後、対応する関数をEvent Queに読み取りに行きます.このプロセスは繰り返します.つまりEvent Loopイベントサイクルです.scripはマクロタスクが終わってから次のマクロタスクを実行します.その中にミクロタスクがあれば、すべてのミクロタスクを実行します.すべてのミクロタスクを実行した後、次のマクロタスクのマクロタスクmacro-task(マクロタスク)を実行します.全体コードscript、set Timeout、set Intervalミクロタスクmicro-task(マイクロタスク):Promise、process.nextTick(process.nextTick)の意味は、次のポーリングを定義します.下記のコード解析:
練習問題1:
console.log('1');
setTimeout(function() {
console.log('2');
process.nextTick(function() {
console.log('3');
})
new Promise(function(resolve) {
console.log('4');
resolve();
}).then(function() {
console.log('5')
})
})
process.nextTick(function() {
console.log('6');
})
new Promise(function(resolve) {
console.log('7');
resolve();
}).then(function() {
console.log('8')
})
setTimeout(function() {
console.log('9');
process.nextTick(function() {
console.log('10');
})
new Promise(function(resolve) {
console.log('11');
resolve();
}).then(function() {
console.log('12')
})
})
最初のマクロタスク:1.最初のマクロタスクscriptは、全体としてメインスレッドに入ると、consosolone.logs出力1.set Timeoutに会って、マクロタスク(今は最初のマクロタスクscriptが実行されていないので、まだマクロタスクに割り当てられていません.)3.次のprocess.nextTickがミクロタスクに割り当てられています.4.Promiseに会って、new Promiseが直接実行し、7を出力します.thenはマイクロタスクEvent Queの中に配られています.この時のミクロタスクテーブル:process.nextTick、Promise.thenは実行結果が6番目のマクロタスク実行結果:1.6番目のマクロタスク:1.2番目のマクロタスクは最初のsetTimeout 2.scriptとの接続順序は同じです.2 process.nextTickを実行すると、ミクロタスクPromiseに割り当てられます.直ちに実行されます.そして、thenはミクロタスク出力結果に割り当てられます.2 3番目のマクロタスクです.3番目のマクロタスクは、2番目のsetTimeoutと2番目のマクロタスクの順に出力されます.9 11,12練習問題1:
// setTimeout
// async1 .then .then
console.log('script start')//1
async function async1() { //async async2()
await async2()
console.log('async1 end') //5
}
async function async2() {
console.log('async2 end') //2
}
async1()
setTimeout(function () {
console.log('setTimeout') // 8
}, 0)
new Promise(resolve => {
console.log('promise') //3
resolve()
}).then(function () {
console.log('promise1') //6
}).then(function () {
console.log('promise2') //7
})
console.log('script end') //4
練習問題2: async function async1() {
console.log(1);
const result = await async2();
console.log(3);
}
async function async2() {
console.log(2);
}
Promise.resolve().then(() => {
console.log(4);
});
setTimeout(() => {
console.log(5);
});
async1();
console.log(6);