js单线程 ,宏任务与微任务

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值