首先先看看概念:
①macro-task(宏任务):包括整体代码script,setTimeout,setInterval
②micro-task(微任务):Promise,process.nextTick
宏任务和微任务的执行流程:
执行机制:宏任务执行完才会去执行微任务,并且是所有的微任务。
new Promise(function(resolve){//promise里面的函数也是同步
console.log(2)
for( var i=0 ; i<10000 ; i++ ){
i==9999 && resolve()
}
console.log(3)
}).then(function(){//异步操作
console.log(4)
});
setTimeout(function(){
console.log(1);//异步操作
},0);
console.log(5);//同步
//2
//3
//5
//4
//1
js单线程顺序是:先同步后异步,这点很重要
①首先会遇到script宏任务,script里面有setTimeout和promise,先执行setTimeout宏任务,再执行promise微任务;
②promise执行后, then会分发到微任务;这时会输出:2、3
③遇到 console 立即执行;这时会输出:5
④整体宏任务(这个宏任务指的是script标签)执行完成,接下来判断是否有微任务,微任务里面有then,执行;这时会输出:4
⑤ok,第一轮事件结束,进行第二轮,刚刚我们放在event queue 的setTimeout 函数进入到宏任务,立即执行;这时会输出:1
⑥结束。