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)
事件循环
-
执行全局Script 同步代码,这些同步代码有一些是同步语句,有一些是异步语句(比如setTimeout等)(这个过程中触发的回调函(比如resolve,)数进入宏/微队列);
-
全局Script执行完毕(执行栈清空),
-
执行微任务队列(微任务进入执行栈),直到微任务队列清空(注意,如果在执行microtask的过程中,又产生了microtask,那么会加入到队列的末尾,也会在这个周期被调用执行;)
-
取出宏队列队首的任务,进入执行栈;
-
执行宏任务(宏任务执行过程中可能产生新的宏任务或微任务,分别入队列,宏队列可能不为空,进入宏队列队尾)
重复 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宏任务进入宏队列
})
本文来自博客园,作者:w0000,转载请注明原文链接:https://www.cnblogs.com/w0000/p/15997094.html