上码:
setTimeout(()=>{
console.log('A')
})
new Promise((resolve)=>{
console.log('B')
resolve()
}).then(()=>{
console.log('C')
})
console.log('D')
执行顺序:
分类:
宏任务:
1.异步Ajax请求
2.setTimeout、setInterval
3.文件操作
4.其他宏任务
微任务:
1.promise.then、promise.catch、promise.finally
2.process.nextTick
3.其他微任务
分析:
首先要明白的一点是,promise实例本身是同步的,只不过其then和catch为
异步(微任务),所以执行代码时首先遇到setTimeout,则将其放入宏任务队列,然后往下执行,遇到同步代码promise,则执行输出B,接着遇到then,则将其放入微任务队列,最后执行同步代码输出D,同步代码都执行完后就开始执行异步任务,异步任务则先执行宏任务,而执行宏任务前必须保证微任务队列为空,则先执行then中的微任务,则输出C,微任务队列为空后开始执行宏任务代码,即输出A。