JS有同步任务和异步任务,异步任务又分为宏任务和微任务。
将JS执行队列分为:执行队列、宏任务队列、微任务队列。
微任务包括 :process.nextTick
,promise
宏任务包括: script
, setTimeout
,setInterval
,setImmediate
JS代码在执行时会先将所有代码放到执行队列中依次执行,在执行中碰到宏任务时,将其放到宏任务队列等候,遇到微任务放到微任务队列等候,执行队列的代码执行完后检查微任务队列,有就放到执行队列中执行,没有就检查宏任务队列,有就放到执行队列。
async function async1() {
await async2()
console.log('async1 end')
}
async function async2() {
console.log('async2 end')
}
console.log('script start')
async1()
setTimeout(function() {
console.log('setTimeout')
}, 0)
new Promise(resolve => {
console.log('Promise')
resolve()
})
.then(function() {
console.log('promise1')
})
.then(function() {
console.log('promise2')
})
console.log('script end')
script start
async2 end
Promise
script end
async1 end
promise1
promise2
setTimeout
分析:
将所有代码放在任务队列中,
1. 执行同步代码 首先打印 script start
2. 然后调用async1(),在async1里有await async2(),打印 async2 end , 然后将console.log('async1 end') 放到微任务队列等待
3. 碰到setTimeout,将console.log('setTimeout') 放到宏任务队列等待(压入宏任务栈中计时器会开启,不会等待执行队列结束后开启,但是其中代码不会执行)
4. 执行同步代码 打印 Promise
5. 执行同步代码 打印 script end
6. 执行微任务 打印promise1 执行微任务 打印promise2
7. 执行宏任务 打印setTimeout