页面循环系统

浏览器页面是由消息队列和事件循环系统来驱动的

  • 消息队列-接收其他线程发送过来的任务,

  • 微任务-使消息队列机制适应效率和实时性,
    异步回调的两种方式:
    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资源)失效

posted @ 2021-12-23 23:31  忘川酒  阅读(41)  评论(0编辑  收藏  举报