Node.js EventEmitter

一、基础用法

参考
《Node.js开发指南 ByVoid》Page 65
Node.js 事件循环
Node.js中文网 events事件触发器

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

Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener2', arg1, arg2);
});
emitter.emit('someEvent', 'byvoid', 1991);
//运行的结果是:
//listener1 byvoid 1991
//listener2 byvoid 1991

这就是 EventEmitter 最简单的用法。接下来我们介绍一下 EventEmitter 常用的API。

  • EventEmitter.on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数 listener 。
  • EventEmitter.emit(event, [arg1], [arg2], [...]) 发射 event 事件,传递若干可选参数到事件监听器的参数表。
  • EventEmitter.once(event, listener) 为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。
  • EventEmitter.removeListener(event, listener) 移除指定事件的某个监听器, listener 必须是该事件已经注册过的监听器。
  • EventEmitter.removeAllListeners([event]) 移除所有事件的所有监听器,如果指定 event ,则移除指定事件的所有监听器。

大多数时候我们不会直接使用 EventEmitter ,而是在对象中继承它。包括 fs 、 net 、http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。为什么要这样做呢?原因有两点。首先,具有某个实体功能的对象实现事件符合语义,事件的监听和发射应该是一个对象的方法。其次 JavaScript 的对象机制是基于原型的,支持部分多重继承,继承 EventEmitter 不会打乱对象原有的继承关系。

二、前端使用

这里要使用Browserify了,参考Browserify + watchify

// require the core node events module
var EventEmitter = require('events').EventEmitter;
//create a new event emitter
var emitter = new EventEmitter;
// set up a listener for the event
emitter.on('teach', function(message){
  console.log(message);
});
// emit an event
emitter.emit('teach', 'tell me how to use browserify');

创建index.js文件,把上面的代码写入index.js文件中。用browserify编译index.js文件到bundle.js:browserify index.js -o bundle.js,创建index.html

<!DOCTYPE html>
<html>
<head>
  <title>node / browserify example</title>
</head>
<body>
<script src="./bundle.js"></script>
</body>
</html>

查看控制台,我们可以看到控制台里输出了tell me how to use browserify。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容