宏任务和微任务解析

本文深入探讨JavaScript的单线程特性及其如何通过宏任务和微任务管理异步执行。介绍了宏任务如setTimeout、Ajax及同步和异步的区别,并强调了Promise回调的异步性质,以及event loop(事件循环)的工作原理。最后,文章提到了Promise在事件循环中的优先级高于setTimeout,并给出了一张事件循环的示意图以帮助理解。
摘要由CSDN通过智能技术生成

JS的特点

JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。

宏任务:

        setTimeout setInterval Ajax DOM事件  script(整体代码)  

微任务: 

         Promise async/await  Object.observe MutationObserver     

同步和异步的区别:

        同步会阻塞程序的执行

        异步不会阻塞程序的执行

        正常在script写的代码是同步代码,宏任务和微任务都是异步代码

注意点:

    Promise是微任务是异步代码??         是又不是

    Promise是本身同步代码,但是Promise的回调 .then和 .catch是异步代码 

这一点要特别注意

宏任务和微任务执行顺序

        微任务执行的时候比宏任务早,当所有的微任务执行完毕后会去执行宏任务,当宏任务内,所有的微任务执行完毕,会执行下一个宏任务,直到没有可执行的语句。术语--event loop(事件循环)

任务队列和event loop(事件循环)

        1)所有的同步任务都在主线程上执行,行成一个执行栈。

        2)除了主线程之外,还存在一个任务列队,只要异步任务有了运行结果,就在任务列队中植入一个时间标记。

        3)主线程完成所有任务(执行栈清空),就会读取任务列队,先执行微任务队列在执行宏任务队列。

        4)重复上面三步。

        只要主线程空了,就会读取任务列队,这就是js的运行机制,也被称为 event loop(事件循环)。

异步和单线程

        异步和单线程是相辅相成的,js是一门单线程脚本语言,所以需要异步来辅助

前端使用异步的场景:
定时任务:
        setTimeout,setInverval

网络请求:
        ajax请求,axios请求,动态<img>加载,事件绑定

考察的是事件循环和回调队列。注意以下几点:

        Promise 优先于 setTimeout 宏任务,所以 setTimeout 回调会最后执行

        Promise 一旦被定义就会立即执行

        Promise 的 resolve 和 reject  是异步执行的回调。所以 resolve() 会被放到回调队列中,在主函数执行完和 setTimeout 之前调用

        await 执行完后,会让出线程。async 标记的函数会返回一个 Promise 对象


事件循环图:

        为了让大家更加清晰的去理解事件循环,宏任务微任务执行,我下面给大家找了一张图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值