详解Node.js中的事件


本文摘自PHP中文网,作者青灯夜游,侵删。

相关推荐:《nodejs 教程》

前端对事件肯定不陌生,为 window 绑定 scroll 事件

1

2

3

window.addEventListener('scroll', ev => {

    console.log(ev);

});

Node.js 大部分异步操作使用事件驱动,所有可以触发事件的对象都继承了 EventEmitter

事件监听

on

Node.js 事件监听使用和 jQuery API 非常类似emitter.on(eventName, listener)

1

2

const ee = new EventEmitter();

ee.on('foo', () => console.log('a'));

  1. EventEmitter 实例会维护一个 listener 数组,每次 listener 默认会被添加到数组尾部
  2. 每次添加 listener 不会检查是否添加过,多次调用 on 传入相同的 eventName 和 listener,会导致 listener 被添加多次

prependListener

emitter.prependListener(eventName, listener)
通过 prependListener 可以把 listener 添加到 listener 数组头部

1

2

const ee = new EventEmitter();

ee.prependListener('foo', () => console.log('a'));

once

如果希望 listener 被触发一次后就不再触发,可以使用 once 来绑定事件

1

2

const ee = new EventEmitter();

ee.once('foo', () => console.log('a'));

事件触发

emitter.emit(eventName[, ...args])
在浏览器环境中开发者事件相关的大部分工作是订阅事件,也就是绑定事件处理函数 listener,在 Node.js 事件编程中经常需要创建事件对象,在合理实际触发事件。使用 emit 方法可以按照 listener 注册的顺序,同步地调用每个注册到名为 eventName 的事件的监听器,并传入提供的参数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

const EventEmitter = require('events');

const myEmitter = new EventEmitter();

 

// 第一个监听器。

myEmitter.on('event', function firstListener() {

  console.log('第一个监听器');

});

// 第二个监听器。

myEmitter.on('event', function secondListener(arg1, arg2) {

  console.log(`第二个监听器中的事件有参数 ${arg1}、${arg2}`);

});

// 第三个监听器

myEmitter.on('event', function thirdListener(...args) {

  const parameters = args.join(', ');

  console.log(`第三个监听器中的事件有参数 ${parameters}`);

});

 

console.log(myEmitter.listeners('event'));

 

myEmitter.emit('event', 1, 2, 3, 4, 5);

 

// Prints:

// [

//   [Function: firstListener],

//   [Function: secondListener],

//   [Function: thirdListener]

// ]

// 第一个监听器

// 第二个监听器中的事件有参数 1、2

// 第三个监听器中的事件有参数 1, 2, 3, 4, 5

this 指向

eventEmitter.emit() 方法可以传任意数量的参数到 listener, this 关键词会被指向 listener 所绑定的 EventEmitter 实例

1

2

3

4

5

6

7

8

9

10

11

const myEmitter = new MyEmitter();

myEmitter.on('event', function(a, b) {

  console.log(a, b, this, this === myEmitter);

  // 打印:

  //   a b MyEmitter {

  //     domain: null,

  //     _events: { event: [Function] },

  //     _eventsCount: 1,

  //     _maxListeners: undefined } true

});

myEmitter.emit('event', 'a', 'b');

也可以使用 ES6 的箭头函数作为监听器。但 this 关键词不会指向 EventEmitter 实例:

1

2

3

4

5

6

const myEmitter = new MyEmitter();

myEmitter.on('event', (a, b) => {

  console.log(a, b, this);

  // 打印: a b {}

});

myEmitter.emit('event', 'a', 'b');

异步调用

EventEmitter 以注册的顺序同步地调用所有 listener,这样可以确保事件的正确排序,listener 可以使用 setImmediate()process.nextTick() 方法切换到异步的操作模式

1

2

3

4

5

6

7

const myEmitter = new MyEmitter();

myEmitter.on('event', (a, b) => {

  setImmediate(() => {

    console.log('异步地发生');

  });

});

myEmitter.emit('event', 'a', 'b');

事件卸载

Node.js 提供了几种卸载事件绑定的方法

off/removeListener

off 方法是 removeListener 方法的别名,用于清理事件绑定 emitter.removeListener(eventName, listener)

1

2

3

4

5

6

const callback = (stream) => {

  console.log('已连接');

};

server.on('connection', callback);

// ...

server.removeListener('connection', callback);

removeListener() 最多只会从监听器数组中移除一个监听器。 如果监听器被多次添加到指定 eventName 的监听器数组中,则必须多次调用 removeListener() 才能移除所有实例

removeAllListeners

emitter.removeAllListeners([eventName])
移除指定的 eventName 事件的 listener,如果没有指定 eventName,则移除事件对象的所有 listener。可以通过 emitter.eventNames() 获取事件对象上的 eventName 数组

1

2

3

4

5

6

const EventEmitter = require('events');

const myEE = new EventEmitter();

myEE.on('foo', () => {});

myEE.on('bar', () => {});

 

myEE.eventNames().forEach(eventName => myEE.removeAllListeners);

更多编程相关知识,请访问:编程视频!!

以上就是详解Node.js中的事件的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

聊聊node.js中json格式和excel格式的双向转换

javascript在nodejs环境下执行机制和事件循环

export和export default中的知识点介绍(附示例)

使用node.js “debug”模块避免日志污染应用程序日志

nodejs怎么升级版本?两种方法介绍

node.js为什么总用mongo

浅谈bootstrap3中的下拉菜单事件

win怎样升级react native 和node.js

npm和yarn安装node-sass的问题解决方法介绍

jquery怎么判断元素是否绑定了事件

更多相关阅读请进入《node.js》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...