事件轮询模型详解

649 阅读2分钟

事件循环(轮询)模型

模型的2个重要组成部分

  • 事件管理模块
  • 回调队列(callback queue) 缓存作用

image.png

callback queue 里面是待执行,等初始化代码全部执行完毕才会依次循环遍历执行callback queue里的回调函数(单线程) !即定时器到了时间或一些DOM事情响应后将调用回调函数放进callback queue,并没有执行!所以定时器有延迟

相关重要概念

  1. 执行栈(execution stack):所有代码都是在此空间中执行
  2. 浏览器内核(browser core):js引擎模块(在主线程处理),其他模块(在主/分线程处理)
  3. callback queue:任务队列、消息队列、事件队列
  4. 事件轮询(event loop):从任务队列中循环取出回调函数放入执行栈中处理(依次)
  5. 事件驱动模型:event-driven interaction model 上图所有
  6. 请求响应模型:request-response model 浏览器与服务器交互

H5 Web Workers(多线程)

主要作用:将一些大计算量的代码(如斐波拉契数列技术,递归)交由web Worker运行(分线程)而不需冻结用户界面,但子线程完全受主线程控制,且不得操作DOM(只能主线程操作DOM),因而也没有从根本上改变js单线程的本质。

  1. 相关API

    • Worker:构造函数,加载分线程执行的js文件
    • Worker.prototype.onmessage:用于接收另一个分线程的回调函数
    • Worker.prototype.postMessage:向另一个分线程发送消息
  2. 不足

    • 慢,并没有加快计算速度,至少不堵塞主线程
    • worker内代码不能操作DOM(不能更新UI,需要window/document方法),分线程内无window全局对象!
    • 不能跨域加载JS
    • 不是每个浏览器都支持这个新特性

使用

  1. 在分线程中创建js执行文件
  2. 在主线程中的js中发送消息并设置回调
<html>
<body>
<input type = "text" placeHolder="数值" id="number">
<button id="btn">计算</button>
<srcipt type="text/javascript">
// 1 1 2 3 5 8 f(n) = f(n-1)+f(n-2)
    var input = document.getElementById("number")
    document.getElementById("btn").onclick = function () {
    var number = input.value
    
    //创建一个worker对象
    var worker = new Worker("worker.js")
    //绑定接受消息监听 回调代码
    worker.onmessage = function (event){
        console.log("主线程接受分线程返回的数据:"+event.data)
        alert(event.data)
    }
    //向分线程发送消息 初始化代码
    worker.postMessage(number)
    console.log("主线程向分线程发送数据:"+number)
    }
​
</srcipt>
</body>
</html>

image.png

worker的this不是window,是自己的,alert就没有