页面循环系统
浏览器页面是由消息队列和事件循环系统来驱动的
-
消息队列-接收其他线程发送过来的任务,
-
微任务-使消息队列机制适应效率和实时性,
异步回调的两种方式:
1.宏任务形式-封装成一个宏任务,添加到消息队列尾部
2.微任务形式-主函数执行结束之后、当前宏任务结束之前执行
宏任务:时间粒度比较大,
微任务:异步执行,执行时机是在主函数执行结束之后、当前宏任务结束之前。
微任务和宏任务是绑定的,每个宏任务在执行时,会创建自己的微任务队列。
应用:1. 观察者模式的核心采用异步微任务机制,权衡了实时性和执行效率的问题。
2. Promise解决回调地狱的问题
回调地狱的原因与promise解决::
1. 多层嵌套的问题 ---> 回调函数延迟绑定和返回值穿透
2. 频繁的错误处理 ---> 错误“冒泡”技术
回调函数延迟绑定通过微任务实现,提升执行效率
3. async/await 解决promise语义方面的问题
- async:异步执行并隐式返回Promise的函数
- await:提交微任务队列,执行同步异步任务
特点:同步代码实现异步访问资源
- 由promise+生成器实现
- 生成器函数是一个带星号函数,可以暂停执行和恢复执行的
实现机制:协程->是一种比线程更加轻量级的存在
gen协程和父协程是在主线程上交互执行的,切换是通过 yield 和 gen.next 来配合完成的。 -
事件循环系统-接收并处理新的任务,执行消息队列
-
事件循环的应用-setTimeout和XMLHttpRequest
-
setTimeout() 定时器,用来指定某个函数在多少毫秒之后执行
原理:直接将任务添加到延时队列中。(处理时机:处理完消息队列的一个任务后,开始执行ProcessDelayTask函数,处理延迟任务。
特点:setTimeout中的this默认指向全局对象,
未激活页面的setTimeout最小间隔是1000毫秒-优化加载损耗及降低耗电量
延时执行时间有最大值,延迟值大于最大值,定时器会被立即执行。
定时器函数里面嵌套调用定时器,也会延长定时器的执行时间-实时性差
缺陷: 消息队列排队和系统级别的限制,setTimeout设置的回调任务并非总是可以实时地被执行,不能满足一些实时性要求较高的需求 -
XMLHttpRequest的实现
同步/异步回调:回调函数在主函数之内执行/在主函数之外执行
XMLHttpRequest运作机制:由浏览器的其他进程执行,再将执行结果
利用IPC的方式通知渲染进程将对应的消息添加到消息队列中。
实现:创建XMLHttpRequest对象;为xhr对象注册回调函数;配置基础的请求信息;发起请求。
缺陷:不允许跨域;浏览器请求混合资源(http资源)失效
-