Events

最后更新于:2022-04-01 01:58:31

### 稳定度: 2 - 稳定 `io.js`中的许多对象触发事件:一个`net.Server`每次被连接时触发事件,一个`fs.readStream`当文件打开时触发事件。所有触发事件的对象都是`events.EventEmitter`的实例。你可以通过`require("events");`来取得这个模块。 通常,事件名以驼峰字符串来命令,但是这不是严格要求的,任何字符串都是可以接受的。 为了处理触发的事件,我们将函数关联到对象上。这些函数被称为监听器。在监听器中,`this`指向监听器所关联的`EventEmitter`实例。 #### Class: events.EventEmitter 使用`require('events')`来获取这个`EventEmitter`类。 ~~~ var EventEmitter = require('events'); ~~~ 当一个`EventEmitter`实例发生了一个错误,一个典型的做法是触发一个`error`事件。`error`事件在`io.js`中被视为一个特殊的事件,如果没有为其添加监听器,默认的行为是打印堆栈追踪信息并推出程序。 所有的`EventEmitter`实例,在被添加新的监听器时,都会触发`newListener`事件。当有监听器被移除时,都会触发`removeListener`事件。 #### emitter.addListener(event, listener) #### emitter.on(event, listener) 为指定的事件,在其监听器数组的末尾添加一个新的监听器。不会去检查这个事件是否已经被监听过。事件的多次触发会导致监听器的多次被调用。 ~~~ server.on('connection', function (stream) { console.log('someone connected!'); }); ~~~ 返回一个`emitter`,所以可以被链式调用。 #### emitter.once(event, listener) 为事件添加一个 一次性 监听器。这个监听器只会在下次事件触发时被调用,之后被移除。 ~~~ server.once('connection', function (stream) { console.log('Ah, we have our first user!'); }); ~~~ 返回一个`emitter`,所以可以被链式调用。 #### emitter.removeListener(event, listener) 从监听器数组中移除指定事件的一个监听器。注意:在数组中,此监听器被移除后,其之后的监听器的索引会被改变。 ~~~ var callback = function(stream) { console.log('someone connected!'); }; server.on('connection', callback); // ... server.removeListener('connection', callback); ~~~ `removeListener`一次只会从监听器数组中移除一个监听器。如果特定事件的单个的监听器被添加了多次,`removeListener`也必须调用同样多次来移除它们。 返回一个`emitter`,所以可以被链式调用。 #### emitter.removeAllListeners([event]) 移除指定事件的所有监听器。使用这个方法来 移除不是在你的代码中创建的`emitter`(如`socket`和`fs`)的所有监听器 ,并不是一个明智的选择。 返回一个`emitter`,所以可以被链式调用。 #### emitter.setMaxListeners(n) 默认的,当一个特定事件被添加了超过10个监听器时,`EventEmitter`会打印一个警告。这是一个对于发现内存泄露非常有用的默认警告。但是显然,并不是所有的`emitter`都应当被限制。这个函数可以用来增加这个上限。如果想要无限制,请设置`0`。 返回一个`emitter`,所以可以被链式调用。 #### emitter.getMaxListeners() 返回`emitter`当前的最大监听器数的值,可能是`emitter.setMaxListeners(n)`设置的值,或者是`EventEmitter.defaultMaxListeners`。 这个值对于调节最大监听器数来避免 不负责任的警告 或 最大监听器数过大,都非常有用。 ~~~ emitter.setMaxListeners(emitter.getMaxListeners() + 1); emitter.once('event', function () { // do stuff emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0)); }); ~~~ #### EventEmitter.defaultMaxListeners `emitter.setMaxListeners(n)`在实例级别设置最大监听器数。这个类属性让你可以设置所有`EventEmitter`的默认最大监听器数,对当前已创建的和未来创建的`EventEmitter`都有效。请谨慎使用它。 注意,`emitter.setMaxListeners(n)`仍优先于`EventEmitter.defaultMaxListeners`。 #### emitter.listeners(event) 返回指定事件的监听器数组。 ~~~ server.on('connection', function (stream) { console.log('someone connected!'); }); console.log(util.inspect(server.listeners('connection'))); // [ [Function] ] ~~~ #### emitter.emit(event[, arg1][, arg2][, ...]) 使用提供的参数,执行每一个监听器。 如果事件有监听器,那么返回`true`,否则返回`false`。 #### Class Method: EventEmitter.listenerCount(emitter, event) 返回指定事件的监听器数。 #### Event: 'newListener' - event String 事件名 - listener Function 事件监听器函数 这个事件在监听器被添加前触发。当这个事件被触发时,监听器还没有被添加到事件的监听器数组中。在`newListener`事件的回调函数中拿到事件名时,监听器还没有开始被添加到该事件。 #### Event: 'removeListener' - event String 事件名 - listener Function 事件监听器函数 这个事件在监听器被移除后触发。当这个事件被触发时,监听器已经从事件的监听器数组中被移除了。
';