浏览器页面是由消息队列和事件循环系统来驱动。事件循环的应用:setTimeout、XMLHttprequest.

浏览器渲染进程:

渲染进程中所有运行在主线程上的任务都需要先添加到消息队列,然后事件循环系统再按照顺序执行消息队列中的任务。

  • 当接收到 HTML 文档数据,渲染引擎就会将“解析 DOM”事件添加到消息队列中,
  • 当用户改变了 Web 页面的窗口大小,渲染引擎就会将“重新布局”的事件添加到消息队列中。
  • 当触发了 JavaScript 引擎垃圾回收机制,渲染引擎会将“垃圾回收”任务添加到消息队列中。
  • 同样,如果要执行一段异步 JavaScript 代码,也是需要将执行任务添加到消息队列中。

事件驱动机制

事件驱动模型(非阻塞式IO):当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。因为 webserver 一直接受请求而不等待任何读写操作。
单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。
nodejs, 1. 单线程 2. api异步方法

补充:
五种IO模型(阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO)

event_loop.jpg
事件队列 事件循环 事件句柄

事件绑定(处理)

  1. // 1.引入events对象, 创建eventEmiter对象
  2. var events = require('events')
  3. var eventEmiiter = new events.EventEmitter()
  4. // 2. 绑定事件处理函数
  5. var connectHandler = function connected() {
  6. console.log('connect 被调用')
  7. }
  8. eventEmitter.on('connection', connectHandler()) // 事件绑定
  9. // 3. 触发事件
  10. eventEmitter.emit()