1. 事件队列( JS的任务队列 )
浏览器是多线程的:
- GUI渲染线程
- HTTP网络请求线程( 6-7个 )
- 事件监听、定时器监听
JS的代码运行时单线程的,浏览器只分配一个GUI线程去执行我们的JS代码
- 对于大部分JS代码来讲,上面代码没有执行完成,下面的代码时不能执行的 " 同步编程 "
- 但是对于某些JS代码来讲( 事件绑定、定时器、Promise、async/await、ajax )等,我们在上面的代码没有处理的情况下,GUI线程能继续向下执行"异步编程"
GUI渲染过程中遇到异步操作,都会放置在Event Queue事件队列中
当浏览器件所有同步代码执行完成,回到事件池中( 事件队列/任务队列中 )查找,例如定时器,到时间了放到GUI中去执行,代码执行完成,又去事件池中查找,我们将这样的循环成为:Event Loop,事件循环机制
Event Queue 优先级队列
微任务优先级永远高于宏任务,宏任务的优先级是按照谁先到达执行谁先执行
微任务:promise / async / await ( nodejs )
宏任务:事件绑定、定时器、ajax异步请求
先找微任务,微任务中还有,则继续找微任务,一直到没有微任务了,才去宏任务中查找
async function async1(){
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2(){
console.log('async2')
}
console.log('script start')
setTimeout(()=>{
console.log('setTimeout')
},0)
async1()
new Promise(function(resolve){
console.log('promise1')
resolve()
}).then(funciton(){
console.log('promise2')
})
console.log('script end')