JS_JS 事件循环 - zen0822/interview GitHub Wiki

JS 事件循环

概览

开局一张图:

JS-事件循环

异步任务

Tasks (Macrotasks)

特点:

  • 当次事件循环执行队列内的一个任务
  • 当次事件循环产生的新任务会在指定时机加入任务队列等待执行

场景:

  • setTimeout
  • setInterval
  • setImmediate(nodejs)
  • I/O(nodejs)

Animation callbacks

特点:

  • 渲染过程(Structure-Layout-Paint)前执行
  • 当次事件循环执行队列里的所有任务
  • 当次事件循环产生的新任务会在下一次循环执行

场景:

  • RAF

Microtasks

特点:

  • 当次事件循环的结尾立即执行的任务
  • 当次事件循环执行队列里的所有任务
  • 当次事件循环产生的新任务会立即执行

场景:

  • Promise
  • Object.observe
  • MutationObserver(nodejs)
  • process.nextTick(nodejs)

exmaple

setTimeout(function() {
  console.log(4)
}, 0);
new Promise(function(resolve) {
  console.log(1);
  for (var i = 0; i < 10000; i++) {
    i == 9999 && resolve()
  }
  console.log(2);
}).then(function() {
  console.log(5)
});
console.log(3);

// 1\2\3\5\4