一、基础用法
参考
《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。