引言:
在Node.js中使用的另一个重要和基本的模式是观察者模式,观察者模式也是平台的支柱之一,并且是使用node核心和用户模块的先决条件
观察者定义了一个理想的解决方案,用于构建Node.js的反应特性,并且是回调的完美补充。下面给出一个正式的定义:
观察者模式定义了一个对象(称为主体),当它的反应状态发生改变时,它可以通知一组观察者(或者监听者)
与回调模式的主要区别是,主体实际上可以通知多个观察者,而传统的CPS回调通常将其结果传播给一个监听者,即回调
EventEmitter类
在传统的面向对象编程中,观察者模式需要接口、实体类和层次结构,而在Node.js中,一切都变得简单了,观察者模式已经内置在内核中,并且可以通过EventEmitter类获得。EventEmitter类允许我们将一个或多个函数注册成监听器,当一个特定的时间类型被触发时,它将被调用:
┌───────────────────────────────────────────────────────────┐
│ │
│ ┌────────────┐ │
│ │ │ │
│ │ │ │
│ │ │ │
│ ┌──►│ Listener │ │
│ │ │ │ │
│ ┌─┬────────────┐ │ │ │ │
│ │ │ │ │ │ │ │
│ ┌─────────────┼─┤ │ │ └────────────┘ │
│ │ │ │ EventA ├─┤ │
│ │ │ │ │ │ ┌────────────┐ │
│ │ └─┼────────────┘ └──►│ │ │
│ │ EventEmitter │ │ Listener │ │
│ │ ┌─┼────────────┐ ┌──►│ │ │
│ │ │ │ │ │ └────────────┘ │
│ │ │ │ EventB ├─┤ │
│ └─────────────┼─┤ │ │ ┌────────────┐ │
│ │ │ │ │ │ │ │
│ └─┴────────────┘ └───► │ │
│ │ │ │
│ │ Listener │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └────────────┘ │
│ │
└───────────────────────────────────────────────────────────┘
EventEmitter类可以从node提供的events模块中获得
let EventEmitter = require('events').EventEmitter
这里给出几个常用的方法
- on
- once
- emit
- removeListner
关于EventEmitter的方法介绍,官网有详细描述http://nodejs.cn/api/events.html
创建和使用EventEmitter
let EventEmitter = require('events').EventEmitter
let fs = require('fs')
function findPattern(files, regex) {
let emitter = new EventEmitter()
files.forEach(file => {
fs.readFile(file, 'utf8', (err, result) => {
if (err) {
return emitter.emit('error', err) //当找不到文件时,注册并触发err事件,把错误传给监听者
}
emitter.emit(</