4.11.1
宏任务与微任务
宏任务:
setInterval, setTimeout, setImmediate, I/O
微任务:
Promise.then Promise.catch Promise.finally, process.nextTick
4.11.2
微任务与宏任务的区别
1.
微任务的回调函数被放置在微任务队列中,宏任务的回调函数被放置在宏任务队列中。
2.
微任务优先级高于宏任务。
当微任务事件队列中存在可以执行的回调函数时,事件循环在执行完当前阶段的回调函数后会暂停
进入事件循环的下一个阶段,事件循环会立即进入微任务的事件队列中开始执行回调函数,当微任
务队列中的回调函数执行完成后,事件循环再进入到下一个阶段开始执行回调函数。
nextTick
的优先级高于
microTask
,在执行任务时,只有
nextTick
中的所有回调函数执行完成后
才会开始执行
microTask
。
不同阶段的宏任务的回调函数被放置在了不同的宏任务队列中,宏任务与宏任务之间没有优先级的
概念,他们的执行顺序是按照事件循环的阶段顺序进行的。
4.12 Event Loop
代码解析
在
Node
应用程序启动后,并不会立即进入事件循环,而是先执行输入代码,从上到下开始执行,同步
API
立即执行,异步
API
交给
C++
维护的线程执行,异步
API
的回调函数被注册到对应的事件队列中。
当所有输入代码执行完成后,开始进入事件循环。
console
.
log
(
"start"
)
setTimeout
(()
=>
{
console
.
log
(
"setTimeout 1"
)
},
0
)
setTimeout
(()
=>
{
console
.
log
(
"setTimeout 2"
)
},
0
)
console
.
log
(
"end"
)
// start end 1 2
setTimeout
(()
=>
console
.
log
(
"1"
),
0
)
setImmediate
(()
=>
console
.
log
(
"2"
))
function
sleep
(
delay
) {
var
start
=
new
Date
().
getTime
()
while
(
new
Date
().
getTime
()
-
start
<
delay
) {