设为首页收藏本站

ZMX - IT技术交流论坛 - 无限Perfect,追求梦想 - itzmx.com

 找回密码
 注册论坛

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

用百度帐号登录

只需两步,快速登录

搜索
查看: 1328|回复: 0

深入理解Node.js 事件循环和回调函数

[复制链接]

签到天数: 36 天

[LV.5]常住居民I

发表于 2016/11/3 16:22 | 显示全部楼层 |阅读模式 |Google Chrome 45.0.2454.101|Windows 7
天涯海角搜一下: 百度 谷歌 360 搜狗 有道 雅虎 必应 即刻
  一、Node.js 事件循环

  Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。

  1、事件驱动程序

  Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为web server一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)。在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

  整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

  ?

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  // 引入 events 模块

  var events = require('events');

  // 创建 eventEmitter 对象

  var eventEmitter = new events.EventEmitter();

  以下程序绑定事件处理程序:

  // 绑定事件及事件的处理程序

  eventEmitter.on('eventName', eventHandler);

  我们可以通过程序触发事件:

  // 触发事件

  eventEmitter.emit('eventName');

  2、实例

  创建 main.js 文件,代码如下所示:

  ?

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  16

  17

  18

  19

  // 引入 events 模块

  var events = require('events');

  // 创建 eventEmitter 对象

  var eventEmitter = new events.EventEmitter();

  // 创建事件处理程序

  var connectHandler = function connected() {

  console.log('连接成功。');

  // 触发 data_received 事件

  eventEmitter.emit('data_received');

  }

  // 绑定 connection 事件处理程序

  eventEmitter.on('connection', connectHandler);

  // 使用匿名函数绑定 data_received 事件

  eventEmitter.on('data_received', function(){

  console.log('数据接收成功。');

  });

  // 触发 connection 事件

  eventEmitter.emit('connection'www.9ask.cn/xiamen/);

  console.log("程序执行完毕。");
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册论坛 新浪微博账号登陆用百度帐号登录

本版积分规则

手机版|Archiver|Mail me|网站地图|IT技术交流论坛 ( 闽ICP备13013206号-7 )

GMT+8, 2024/12/28 17:30 , Processed in 0.158931 second(s), 20 queries , MemCache On.

Powered by itzmx! X3.4

© 2011- sakura

快速回复 返回顶部 返回列表