事件


【Events】

源代码: lib/events.js

Node.js 的大部分核心 API 都是基于一种惯用的异步事件驱动架构构建的,其中某些类型的对象(称为“触发器”)会触发命名事件,从而调用 Function 对象(“监听器”)。

【Much of the Node.js core API is built around an idiomatic asynchronous event-driven architecture in which certain kinds of objects (called "emitters") emit named events that cause Function objects ("listeners") to be called.】

例如:每当有对等方连接到它时,net.Server 对象会触发一个事件;fs.ReadStream 在文件被打开时触发一个事件;溪流 每当有可读取的数据时触发一个事件。

【For instance: a net.Server object emits an event each time a peer connects to it; a fs.ReadStream emits an event when the file is opened; a stream emits an event whenever data is available to be read.】

所有触发事件的对象都是 EventEmitter 类的实例。这些对象提供了一个 eventEmitter.on() 函数,允许将一个或多个函数附加到对象发出的命名事件上。通常,事件名称是驼峰式字符串,但任何有效的 JavaScript 属性键都可以使用。

【All objects that emit events are instances of the EventEmitter class. These objects expose an eventEmitter.on() function that allows one or more functions to be attached to named events emitted by the object. Typically, event names are camel-cased strings but any valid JavaScript property key can be used.】

EventEmitter 对象触发一个事件时,所有附加到该特定事件的函数都会被 同步 调用。所有被调用的监听器返回的值都会被 忽略 并丢弃。

【When the EventEmitter object emits an event, all of the functions attached to that specific event are called synchronously. Any values returned by the called listeners are ignored and discarded.】

下面的示例展示了一个简单的 EventEmitter 实例,它只有一个监听器。使用 eventEmitter.on() 方法来注册监听器,而使用 eventEmitter.emit() 方法来触发事件。

【The following example shows a simple EventEmitter instance with a single listener. The eventEmitter.on() method is used to register listeners, while the eventEmitter.emit() method is used to trigger the event.】

import { EventEmitter } from 'node:events';

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');const EventEmitter = require('node:events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');