理解JS异步编程
1是什么原因决定JavaScript这门语言是单线程模式呢?
JavaScript这门语言是运行在浏览器端的脚步语言,他的目的是用来实现页面间的动态交互。
而实现页面交互核心就是DOM操作,所以他必须是一个单线程模式。如果是多线程模型其中一个线程修改了DOM元素而一个线程删除了DOM元素,那我们的浏览器就不知道
以哪个线程为最终结果,所以就决定这么语言为单线程语言。
所以js执行环境中负责执行代码的线程只有一个
优点(更安全,更简单)
缺点 在执行过程有个任务执行时间很长这样就会导致我们整个任务执行会被
拖延从出现假死的情况,为了解决这个问题JavaScript把任务的执行分为两种情况
1同步模式 2异步模式
什么是异步模式?
不会等待这个任务的结束才开始下一个任务,对于耗时操作他会开启过后就立即往后执行下一个任务,后续逻辑一般会通过回调函数的方式定义
常用的JS异步编程的处理方式有回调函数、事件、Promise、Generator、Async Await。
EventLoop、消息队列是做什么的
在JS引擎执行一段代码的过程中,主要会经历几个阶段:
读取代码=>
压入执行栈=>
执行栈处理各个任务=>
遇到同步任务,处理完,排出执行栈,=>
遇到异步任务,执行栈处理完后,内部web apis 会给这个任务开启一个到计时器,当计时结束后,依次将该函数注册到消息队列中=>
当执行栈的任务已经执行完成,空闲时=>
通过EventLoop会监测到,此时便将消息队列中的任务压入执行栈,逐个执行。
什么是宏任务
宏任务是消息队列里的任务,常见的接口请求、定时器等异步任务都是宏任务。
什么是微任务
微任务是基于当前任务产生而随当前任务结束后立即执行的任务,所以也是异步任务, 但是不需要通过EventLoop监测,通过消息队列取出并压入执行栈中再执行; 像通过Promise、MutationObserver、process.nextTick产生的任务都为微任务。