js单线程
JavaScript作为浏览器脚本语言,只要是在于和用户进行交互/处理前端数据/操作DOM。
所以,它无法进行多线程操作
微任务与宏任务
同步:在一个线程上(主栈/主任务队列)同一个时间只能做一件事情,当前事情完成才能进行下一个事情(先把一个任务进栈执行,执行完成,在把下一个任务进栈,上一个任务出栈…)
异步:在主栈中执行一个任务,但是发现这个任务是一个异步的操作,我们会把它移除主栈,放到等待任务队列中(此时浏览器会分配其它线程监听异步任务是否到达指定的执行时间),如果主栈执行完成,监听者会把到达时间的异步任务重新放到主栈中执行…
[宏任务:macro task]
- 定时器
- 事件绑定
- ajax
- 回调函数
- Node中fs可以进行异步的I/O操作
[微任务:micro task]
- Promise(async/await) => Promise并不是完全的同步,当在Excutor中执行resolve或者reject的时候,此时是异步操作,会先执行then/catch等,当主栈完成后,才会再去调用resolve/reject把存放的方法执行
- process.nextTick (node中实现的api,把当前任务放到主栈最后执行,当主栈执行完,先执行nextTick,再到等待队列中找)
- - MutationObserver (创建并返回一个新的 MutationObserver 它会在指定的DOM发生变化时被调用。)
执行顺序
同步 -> 异步(微任务) -> 异步(宏任务)
例:
console.log("s start") //1
async function async1(){
await async2()
console.log("a1 end") //5
}
async function async2(){
console.log("a2 end") //2
setTimeout(function(){
console.log(11)
})
}
async1()
setTimeout(function(){
console.log("settimeout1212") //9
},100)
setTimeout(function(){
console.log("settimeout") //8
},0)
new Promise( resolve =>{
console.log('promise') //3
resolve()
}).then(function(){
console.log("promise1")//6
}).then(function(){
console.log("promise2")//7
})
console.log("script end") //4