正常任务(宏任务)和微任务
最近突然被问到关于正常任务(宏任务)和微任务的问题,学习js这么长时间来,还没有注意到js的任务还有宏任务和微任务的区别,在网上查找以后大概知道了什么是宏任务和微任务。
首先,宏任务包含:setTimeout/setInterval/setImmediate/整体代码script
而微任务包含:promise和process.nextTick
从结果来说,两者的区别在于在事件循环机制中,执行的机制不同,具体执行顺序是这样:
每次执行栈的同步任务执行完毕,就会去任务队列中取出完成的异步任务,队列中又分为microtasks queues和宏任务队列
等到把microtasks queues所有的microtasks
都执行完毕,注意是所有的
,他才会从宏任务队列
中取事件。等到把队列中的事件取出一个
,放入执行栈执行完成,就算一次循环结束,之后event loop
还会继续循环,他会再去microtasks queues
执行所有的任务,然后再从宏任务队列
里面取一个
,如此反复循环。
同步任务执行完
去执行microtasks
,把所有microtasks queues
清空
取出一个macrotasks queues
的完成事件,在执行栈执行
再去执行microtasks
...
...
...
所以结果上来看,当有宏任务和微任务同时在队列中时,微任务一般来说,执行的优先级较高,每次event loop都会清空一次微任务队列,而每个宏任务都会触发一次event loop
文章参考:https://yq.aliyun.com/articles/607031