以chrome为例
setTimeout(function(){ console.log('setTimeout')},0)
new Promise(function(resolve){
console.log('promise')
resolve()
}).then(function(){
console.log('then')
})浏览器eventloop机制
js执行为单线程,因此分为 同步和异步
先执行同步任务,即 setTimeout , new Promise, console.log('promise')
在异步时分为 宏任务 和 微任务,
setTimeout,setInterval等为宏任务,Promise为微任务。两个任务被挂载到不同的task queue中。
浏览器先执行微任务的queue,即console.log(‘then’)然后在执行 宏任务 console.log(‘setTimeoout’)
碰到 async/await时 在 await 后面的会包装到 .then()里面去执行,所以会推到微任务
function await1() {
console.log('await start')
}
async function async(){
await await1()
console.log('await end')
}
setTimeout(()=>{console.log('setTimeout')},0)
console.log('start')
async()
new Promise((resolve)=>{ console.log('promise start');resolve()}).then(()=>{ console.log('promise end')})
console.log('end')以上执行顺序为
start
await start
promise start
end
await end
promise end
setTimeout