第26节 Node.js 事件

Node里很多对象会分发事件: 每次有连接的时候net.Server会分发事件,当文件打开的时候fs.readStream会分发事件。所有能分发事件的对象都是 events.EventEmitter的实例。通过require("events");能访问这个模块。

一般来说,事件名都遵照驼峰规则,但这不是强制规定,任何形式的字符串都可以做为事件名。

为了处理事件,通常将函数关联到对象上。这些函数也叫监听者(listeners)。在这个函数里,this指向监听者所关联的EventEmitter

类: events.EventEmitter

你可以通过require('events').EventEmitter获取EventEmitter类。

EventEmitter实例遇到错误后,通常会触发一个错误事件。错误事件在node里是特殊例子。如果没有监听者,默认的操作是打印一个堆栈信息并退出程序。

当添加新的监听者时, EventEmitters会触发'newListener'事件,当移除时会触发'removeListener'

emitter.addListener(event, listener)

emitter.on(event, listener)

添加一个监听者到特定event的监听数组的尾部,触发器不会检查是否已经添加过这个监听者。 多次调用相同的eventlistener将会导致listener添加多次。

复制代码
server.on('connection', function (stream) {
  console.log('someone connected!');
});

返回emitter。

emitter.once(event, listener)

给事件添加一个一次性的listener,这个listener只会被触发一次,之后就会被移除。

复制代码
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});

返回emitter。

emitter.removeListener(event, listener)

从一个某个事件的listener数组中移除一个listener。注意,这个操作会改变listener数组内容的次序。

复制代码
var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);

removeListener最多会移除数组里的一个listener。如果多次添加同一个listener到数组,那就需要多次调用removeListener来移除每一个实例。

返回emitter。

emitter.removeAllListeners(event)

移除所有的listener,或者某个事件listener。最好不要移除全部listener,尤其是那些不是你传入的(比如socket或文件流)。

返回emitter。

emitter.setMaxListeners(n)

默认情况下,给单个事件添加超过10个listener,事件分发器会打印警告。这样有利于检查内存泄露。不过不是所有的分发器都应该限制在10个,这个函数允许改变 listener数量,无论是0还是更多。

返回emitter。

EventEmitter.defaultMaxListeners

emitter.setMaxListeners(n)设置一个分发器的最大listener数,而这个函数会立即设置所有 EventEmitter的当前值和默认值。要小心使用。

请注意,emitter.setMaxListeners(n)的优先级高于EventEmitter.defaultMaxListeners.

emitter.listeners(event)

用于返回事件的listener数组。

复制代码
server.on('connection', function (stream) {
  console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection'))); // [ [Function] ]

emitter.emit(event, arg1, arg2, ...)

允许你使用指定的参数顺序的执行每一个listener.

如果事件有 listener,返回true, 否则false

类方法: EventEmitter.listenerCount(emitter, event)

返回指定事件的listener数量。

Event: 'newListener'

  • event{String}事件名
  • listener{Function}事件处理函数

添加listener的时候会触发这个事件。当这个事件触发的时候,listener可能还没添加到listener数组。

Event: 'removeListener'

  • event{String}事件名
  • listener{Function}事件处理函数

删除listener的时候会触发这个事件。当这个事件触发的时候,listener可能还还没从listener数组移除。

相关推荐
无风听海10 分钟前
构建现代 Web 应用的令牌安全体系:Refresh Token Rotation、HttpOnly Cookie 与 Grace Period 全解析
前端·安全
云水一下11 分钟前
JavaScript 从零基础到精通系列:对象、数组与 ES6 数据操作利器
前端·javascript
四代水门11 分钟前
服务端倒带(Server-Side Rewind)命中判定系统
java·前端·算法
宋浮檀s12 分钟前
应急响应——Web高危漏洞应急(SQL注入+XSS跨站+文件上传)
前端·网络·安全·web安全·xss
前端后腿哥12 分钟前
UNIAPPX UTS插件Widget开发完整教程(Android版)
前端·uni-app
大家的林语冰15 分钟前
AI 遥控代码截图,录制终端动画,定制自动化批量制图流程,解放你的双手~
前端·ai编程·trae
原来是猿16 分钟前
性能测试(1)
运维·服务器·python·压力测试
郝学胜-神的一滴17 分钟前
CMake 012:Linux 下动态库与可执行程序的单文件构建
linux·服务器·开发语言·c++·软件构建·cmake
无聊的老谢21 分钟前
Vue 3 + Leaflet 实现高性能 Web GIS 基站监控平台
前端·javascript·vue.js
之歆22 分钟前
Day23_Bootstrap 前端框架完全指南:从栅格系统到组件化开发
开发语言·前端·javascript·前端框架·bootstrap·ecmascript·less