node.js 基础 API - events

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

猜你喜欢

转载自blog.csdn.net/purple_lumpy/article/details/89212398