因为Promise产生的是JavaScript引擎内部的微任务,而setTimeout是浏览器API,它产生宏任务。
我们把宿主发起的任务称为宏观任务,把 JavaScript引擎发起的任务称为微观任务。许多的微观任务的队列组成了宏观任务。
宏观任务队列与微观任务队列
ES6标准中任务队列存在两种类型:
宏观任务(marcotask):
setTimeout,setInterval
requestAnimationFrame
解析HTML
执行主线程js代码
修改url
页面加载
用户交互
微观任务(mircotask):
promise
mutation.oberver
process.nextTick
ES6添加了微观任务队列之后在执行栈执行的过程中会把属于微观任务队列的任务分配到相应的微观任务队列中去。而在调用栈执行空之后,主线程读取任务队列时,会先读取所有微观任务队列,然后读取一个宏观任务队列,再读取所有的微观任务队列。
注意:sync 函数强大之处在于,它是可以嵌套的。
网友评论