Event Loop

2020-01-20  本文已影响0人  BingeryLamb
  1. 执行全局script
    完毕调用栈Stack会清空
  2. microtask queue中取出位于队首的回调任务, 放入调用栈Stack中执行
    执行完后, 继续取出位于队首的任务,放入调用栈Stack中执行
    以此类推, 直到microtask queue中的所有任务都执行完毕
    microtask queue为空队列, 调用栈Stack也为空
  3. macrotask queue中取出位于队首的任务, 放入Stack中执行
    执行完毕后, 调用栈Stack为空
  4. 重复2-3
    重复2-3
    ...
宏队列

macrotask
一些异步任务的回调会依次进入macro task queue, 等待后续被调用
\color{red}{setTimeout}
\color{red}{setInterval}
I/O
...

微队列

一些异步任务的回调会依次进入micro task queue, 等待后续被调用
process.nextTick (Node独有)
\color{red}{Promise}
\color{red}{Object.observe}
...

console.log(1);

setTimeout(() => {
  console.log(2);
  Promise.resolve().then(() => {
    console.log(3)
  });
});

new Promise((resolve, reject) => {
  console.log(4)
  resolve(5)
}).then((data) => {
  console.log(data);
})

setTimeout(() => {
  console.log(6);
})

console.log(7);
// 1 4 7 5 2 3 6
上一篇下一篇

猜你喜欢

热点阅读