イベントループブラウザvsNode

基準T質問は:
各キューを描画し、順次出力するステップによって行われるでスロー

ブラウザ:

  • マクロタスク(マクロタスク):スクリプトコード、のsetTimeout、のsetInterval、I / O、UIレンダリング;
  • マイクロタスク(マイクロタスク):約束、Object.observe、MutationObserver。

(プロミス自体が同期され、次いで、マイクロあります)

while (true) {
  宏任务队列.shift()
  微任务队列全部任务()
}

ノード:

  • マイクロ
  • タイマー
  • I / O
  • チェック
  • 閉じるを使用
    (その他、あまり一般的に、この記事では無視)
  1. サイクルの前に
    最初のサイクルに入る前に、私たちは、次の操作を行います:
  • 同期タスク
  • 非同期要求
  • 力のタイマーを計画するための時間
  • 実行process.nextTick()
  1. サイクルを開始します。
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で再現

おすすめ

転載: blog.csdn.net/weixin_33727510/article/details/91071779