events 即事件对象
http://nodejs.cn/api/events.html
大多数 Node.js 核心API 都采用异步事件驱动架构,比如 I/O 操作,当主进程遇到 I/O 操作时,就会把 I/O 交给底层,然后完成后会通知主进程。通知方式是触发一个事件,以此来告诉主进程。
例如,net.Server
会在每次有新连接时触发事件,fs.ReadStream
会在打开文件时触发事件,stream会在数据可读时触发事件。
在Node.js 中,所有能触发事件的对象都是 EventEmitter
类的实例。 这些对象有一个 eventEmitter.on()
函数,用于将一个或多个函数绑定到命名事件上。 事件的命名通常是驼峰式的字符串。
当 EventEmitter
对象触发一个事件时,所有绑定在该事件上的函数都会被同步地调用。
例子,一个简单的 EventEmitter
实例,绑定了一个监听器。 eventEmitter.on()
用于注册监听器, eventEmitter.emit()
用于触发事件。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on("test", () => {
console.log("触发事件");
})
myEmitter.emit("test")
然后,试一试将参数和this 传给事件处理程序。eventEmitter.emit()
方法可以传任意数量的参数到监听器函数。 当监听器函数被调用时, this
关键词会被指向监听器所绑定的 EventEmitter
实例。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const ce = new MyEmitter();
ce.on('error', (err,time) => {
console.log(err);
console.log(time);
})
ce.emit("error",new Error('oops'), Date.now());
另一种情况,我们只想让一个事件只会被触发一次。可以使用once 函数,如下。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const ce = new MyEmitter();
ce.on('error', (err,time) => {
console.log(err);
console.log(time);
})
ce.once('test', () => {
console.log("this is test");
})
ce.emit("test");
ce.emit("test");
ce.emit("error",new Error('oops'), Date.now());
然后,我们也可以给一个事件添加多个处理事件处理程序的
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
function fn1 () {
console.log("fn1");
}
function fn2 () {
console.log("fn2");
}
const ce = new MyEmitter();
ce.on("fnfnfn", fn1);
ce.on("fnfnfn", fn2);
ce.emit("fnfnfn");
接下来,我们看看删除事件
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
function fn1 () {
console.log("fn1");
}
function fn2 () {
console.log("fn2");
}
const ce = new MyEmitter();
ce.on("fnfnfn", fn1);
ce.on("fnfnfn", fn2);
setInterval(() => {
ce.emit("fnfnfn");
},500);
setTimeout(() => {
// ce.removeListener("fnfnfn",fn1);
// ce.removeListener("fnfnfn",fn2);
ce.removeAllListeners("fnfnfn");
},5000);
Done