基準T質問は:
各キューを描画し、順次出力するステップによって行われるでスロー
ブラウザ:
- マクロタスク(マクロタスク):スクリプトコード、のsetTimeout、のsetInterval、I / O、UIレンダリング;
- マイクロタスク(マイクロタスク):約束、Object.observe、MutationObserver。
(プロミス自体が同期され、次いで、マイクロあります)
while (true) {
宏任务队列.shift()
微任务队列全部任务()
}
ノード:
- マイクロ
- タイマー
- I / O
- チェック
- 閉じるを使用
(その他、あまり一般的に、この記事では無視)
- サイクルの前に
最初のサイクルに入る前に、私たちは、次の操作を行います:
- 同期タスク
- 非同期要求
- 力のタイマーを計画するための時間
- 実行process.nextTick()
- サイクルを開始します。
while (true) {
loop.forEach((阶段) => {
阶段全部任务()
nextTick全部任务()
microTask全部任务()
})
loop = loop.next
}
小演習:
function sleep(time) {
let startTime = new Date();
while (new Date() - startTime < time) {}
console.log("1s over");
}
setTimeout(() => {
console.log("setTimeout - 1");
setTimeout(() => {
console.log("setTimeout - 1 - 1");
sleep(1000);
});
new Promise(resolve => resolve()).then(() => {
console.log("setTimeout - 1 - then");
new Promise(resolve => resolve()).then(() => {
console.log("setTimeout - 1 - then - then");
});
});
sleep(1000);
});
setTimeout(() => {
console.log("setTimeout - 2");
setTimeout(() => {
console.log("setTimeout - 2 - 1");
sleep(1000);
});
new Promise(resolve => resolve()).then(() => {
console.log("setTimeout - 2 - then");
new Promise(resolve => resolve()).then(() => {
console.log("setTimeout - 2 - then - then");
});
});
sleep(1000);
});
参考
https://segmentfault.com/a/1190000013660033?utm_source=channel-hottest
ます。https://www.jianshu.com/p/1c3b894e6c2dで再現