Js 事件循环(event loop)

宏队列

宏队列,macrotask,也叫tasks。 一些异步任务的回调会依次进入macro task queue,等待后续被调用,这些异步任务包括:

setTimeout
setInterval
setImmediate (Node独有)
requestAnimationFrame (浏览器独有)
I/O
UI rendering (浏览器独有)

微队列

微队列,microtask,也叫jobs。 另一些异步任务的回调会依次进入micro task queue,等待后续被调用,这些异步任务包括:

process.nextTick (Node独有)
Promise
Object.observe
MutationObserver
(注:这里只针对浏览器和NodeJS)

事件循环

  1. 执行全局Script 同步代码,这些同步代码有一些是同步语句,有一些是异步语句(比如setTimeout等)(这个过程中触发的回调函(比如resolve,)数进入宏/微队列);

  2. 全局Script执行完毕(执行栈清空),

  3. 执行微任务队列(微任务进入执行栈),直到微任务队列清空(注意,如果在执行microtask的过程中,又产生了microtask,那么会加入到队列的末尾,也会在这个周期被调用执行;)

  4. 取出宏队列队首的任务,进入执行栈;

  5. 执行宏任务(宏任务执行过程中可能产生新的宏任务或微任务,分别入队列,宏队列可能不为空,进入宏队列队尾)

重复 3,4,5....

重复 3,4,5....

...

如果在执行microtask的过程中,又产生了microtask,那么会加入到队列的末尾,也会在这个周期被调用执行

Promise.resolve().then(() => {
            console.log("1");
        }).then(() => {
            console.log("2");
        })
        Promise.resolve().then(() => {
            console.log("3");
        })
//1 3 2

Promise resolve触发
  • 手动触发

new Promise((resolve, reject) => {
console.log(4)//正常执行同步语句
resolve(5)//使Promise微任务进入微队列
}).then((data) => {
console.log(data);
})

  • 立即触发

   Promise.resolve().then(() => {//微任务进入微队列
console.log("1");
setTimeout(() => { console.log("0s") }, 0)//当微任务执行时,使setTimeout宏任务进入宏队列
})

https://segmentfault.com/a/1190000016278115

posted @ 2022-03-12 14:15  w0000  阅读(317)  评论(0编辑  收藏  举报