js单线程
我们知道JavaScript是单线程,就是任务或者代码将要按顺序执行,但是在我们写的代码中可能存在Dom操作,导致线程无法进行或者说阻塞。所有js采用的是单线程
同步异步
我们将js代码分为同步代码和异步代码,js将异步代码放到宿主环境去执行。在浏览器中就是WebApis。然后自身继续在执行栈中执行同步代码,注意此时异步代码在浏览器中也会被执行,当异步任务有了结果后比如setTimeout的等待时间,promise的状态,将会进入任务队列。
事件循环+宏任务+微任务
任务队列又分为宏任务和微任务。
宏任务:script,setTimeout,setInterval, setImmediate,i/o,UIrendering
微任务:process.nextTick,Promise.then等
宏任务将会进宏任务队列,微任务进入微任务队列。
当执行栈为空时,浏览器的事件循环机制将会把任务队列中的事件加入到执行栈中,注意先执行宏任务然后再清空此次的微任务队列,再继续执行下一个宏任务,再清空微任务。不断将任务队列中的事件加入执行栈,这整个过程就是事件循环。
new Promise((resolve,reject)=>{
setTimeout(function(){
console.log("1")
resolve()
},2000)
.then(res=>{console.log("2")})
//1
//2
//因为中执行promise中有宏任务setTimeout等2秒后再放入宏队列,同理then要等promise的状态变才会放入微任务队列。