doc: add ESM version examples to events api doc

PR-URL: https://github.com/nodejs/node/pull/43226
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Feng Yu 2022-05-28 11:50:20 +08:00 committed by Luigi Pinca
parent dc53c29b97
commit 1737c7741f

View File

@ -30,7 +30,19 @@ The following example shows a simple `EventEmitter` instance with a single
listener. The `eventEmitter.on()` method is used to register listeners, while listener. The `eventEmitter.on()` method is used to register listeners, while
the `eventEmitter.emit()` method is used to trigger the event. the `eventEmitter.emit()` method is used to trigger the event.
```js ```mjs
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
```
```cjs
const EventEmitter = require('node:events'); const EventEmitter = require('node:events');
class MyEmitter extends EventEmitter {} class MyEmitter extends EventEmitter {}
@ -160,7 +172,18 @@ myEmitter.emit('error', new Error('whoops!'));
It is possible to monitor `'error'` events without consuming the emitted error It is possible to monitor `'error'` events without consuming the emitted error
by installing a listener using the symbol `events.errorMonitor`. by installing a listener using the symbol `events.errorMonitor`.
```js ```mjs
import { EventEmitter, errorMonitor } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on(errorMonitor, (err) => {
MyMonitoringTool.log(err);
});
myEmitter.emit('error', new Error('whoops!'));
// Still throws and crashes Node.js
```
```cjs
const { EventEmitter, errorMonitor } = require('node:events'); const { EventEmitter, errorMonitor } = require('node:events');
const myEmitter = new EventEmitter(); const myEmitter = new EventEmitter();
@ -208,7 +231,19 @@ ee2[Symbol.for('nodejs.rejection')] = console.log;
Setting `events.captureRejections = true` will change the default for all Setting `events.captureRejections = true` will change the default for all
new instances of `EventEmitter`. new instances of `EventEmitter`.
```js ```mjs
import { EventEmitter } from 'node:events';
EventEmitter.captureRejections = true;
const ee1 = new EventEmitter();
ee1.on('something', async (value) => {
throw new Error('kaboom');
});
ee1.on('error', console.log);
```
```cjs
const events = require('node:events'); const events = require('node:events');
events.captureRejections = true; events.captureRejections = true;
const ee1 = new events.EventEmitter(); const ee1 = new events.EventEmitter();
@ -237,7 +272,11 @@ changes:
The `EventEmitter` class is defined and exposed by the `node:events` module: The `EventEmitter` class is defined and exposed by the `node:events` module:
```js ```mjs
import { EventEmitter } from 'node:events';
```
```cjs
const EventEmitter = require('node:events'); const EventEmitter = require('node:events');
``` ```
@ -337,7 +376,40 @@ to each.
Returns `true` if the event had listeners, `false` otherwise. Returns `true` if the event had listeners, `false` otherwise.
```js ```mjs
import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
```
```cjs
const EventEmitter = require('node:events'); const EventEmitter = require('node:events');
const myEmitter = new EventEmitter(); const myEmitter = new EventEmitter();
@ -381,8 +453,23 @@ added: v6.0.0
Returns an array listing the events for which the emitter has registered Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or `Symbol`s. listeners. The values in the array are strings or `Symbol`s.
```js ```mjs
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
```
```cjs
const EventEmitter = require('node:events'); const EventEmitter = require('node:events');
const myEE = new EventEmitter(); const myEE = new EventEmitter();
myEE.on('foo', () => {}); myEE.on('foo', () => {});
myEE.on('bar', () => {}); myEE.on('bar', () => {});
@ -757,7 +844,26 @@ promise rejection happens when emitting an event and
It is possible to use [`events.captureRejectionSymbol`][rejectionsymbol] in It is possible to use [`events.captureRejectionSymbol`][rejectionsymbol] in
place of `Symbol.for('nodejs.rejection')`. place of `Symbol.for('nodejs.rejection')`.
```js ```mjs
import { EventEmitter, captureRejectionSymbol } from 'node:events';
class MyClass extends EventEmitter {
constructor() {
super({ captureRejections: true });
}
[captureRejectionSymbol](err, event, ...args) {
console.log('rejection happened for', event, 'with', err, ...args);
this.destroy(err);
}
destroy(err) {
// Tear the resource down here.
}
}
```
```cjs
const { EventEmitter, captureRejectionSymbol } = require('node:events'); const { EventEmitter, captureRejectionSymbol } = require('node:events');
class MyClass extends EventEmitter { class MyClass extends EventEmitter {
@ -853,7 +959,24 @@ the emitter.
For `EventTarget`s this is the only way to get the event listeners for the For `EventTarget`s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes. event target. This is useful for debugging and diagnostic purposes.
```js ```mjs
import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
getEventListeners(ee, 'foo'); // [listener]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
getEventListeners(et, 'foo'); // [listener]
}
```
```cjs
const { getEventListeners, EventEmitter } = require('node:events'); const { getEventListeners, EventEmitter } = require('node:events');
{ {
@ -897,7 +1020,32 @@ This method is intentionally generic and works with the web platform
[EventTarget][WHATWG-EventTarget] interface, which has no special [EventTarget][WHATWG-EventTarget] interface, which has no special
`'error'` event semantics and does not listen to the `'error'` event. `'error'` event semantics and does not listen to the `'error'` event.
```js ```mjs
import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.log('error happened', err);
}
```
```cjs
const { once, EventEmitter } = require('node:events'); const { once, EventEmitter } = require('node:events');
async function run() { async function run() {
@ -930,7 +1078,21 @@ is used to wait for another event. If `events.once()` is used to wait for the
'`error'` event itself, then it is treated as any other kind of event without '`error'` event itself, then it is treated as any other kind of event without
special handling: special handling:
```js ```mjs
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.log('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
```
```cjs
const { EventEmitter, once } = require('node:events'); const { EventEmitter, once } = require('node:events');
const ee = new EventEmitter(); const ee = new EventEmitter();
@ -946,7 +1108,31 @@ ee.emit('error', new Error('boom'));
An {AbortSignal} can be used to cancel waiting for the event: An {AbortSignal} can be used to cancel waiting for the event:
```js ```mjs
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
```
```cjs
const { EventEmitter, once } = require('node:events'); const { EventEmitter, once } = require('node:events');
const ee = new EventEmitter(); const ee = new EventEmitter();
@ -979,7 +1165,31 @@ because the `process.nextTick()` queue is drained before the `Promise` microtask
queue, and because `EventEmitter` emits all events synchronously, it is possible queue, and because `EventEmitter` emits all events synchronously, it is possible
for `events.once()` to miss an event. for `events.once()` to miss an event.
```js ```mjs
import { EventEmitter, once } from 'node:events';
import process from 'node:process';
const myEE = new EventEmitter();
async function foo() {
await once(myEE, 'bar');
console.log('bar');
// This Promise will never resolve because the 'foo' event will
// have already been emitted before the Promise is created.
await once(myEE, 'foo');
console.log('foo');
}
process.nextTick(() => {
myEE.emit('bar');
myEE.emit('foo');
});
foo().then(() => console.log('done'));
```
```cjs
const { EventEmitter, once } = require('node:events'); const { EventEmitter, once } = require('node:events');
const myEE = new EventEmitter(); const myEE = new EventEmitter();
@ -1006,7 +1216,26 @@ To catch both events, create each of the Promises _before_ awaiting either
of them, then it becomes possible to use `Promise.all()`, `Promise.race()`, of them, then it becomes possible to use `Promise.all()`, `Promise.race()`,
or `Promise.allSettled()`: or `Promise.allSettled()`:
```js ```mjs
import { EventEmitter, once } from 'node:events';
import process from 'node:process';
const myEE = new EventEmitter();
async function foo() {
await Promise.all([once(myEE, 'bar'), once(myEE, 'foo')]);
console.log('foo', 'bar');
}
process.nextTick(() => {
myEE.emit('bar');
myEE.emit('foo');
});
foo().then(() => console.log('done'));
```
```cjs
const { EventEmitter, once } = require('node:events'); const { EventEmitter, once } = require('node:events');
const myEE = new EventEmitter(); const myEE = new EventEmitter();
@ -1075,8 +1304,19 @@ deprecated: v3.2.0
A class method that returns the number of listeners for the given `eventName` A class method that returns the number of listeners for the given `eventName`
registered on the given `emitter`. registered on the given `emitter`.
```js ```mjs
import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
```
```cjs
const { EventEmitter, listenerCount } = require('node:events'); const { EventEmitter, listenerCount } = require('node:events');
const myEmitter = new EventEmitter(); const myEmitter = new EventEmitter();
myEmitter.on('event', () => {}); myEmitter.on('event', () => {});
myEmitter.on('event', () => {}); myEmitter.on('event', () => {});
@ -1098,7 +1338,28 @@ added:
* `signal` {AbortSignal} Can be used to cancel awaiting events. * `signal` {AbortSignal} Can be used to cancel awaiting events.
* Returns: {AsyncIterator} that iterates `eventName` events emitted by the `emitter` * Returns: {AsyncIterator} that iterates `eventName` events emitted by the `emitter`
```js ```mjs
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
```
```cjs
const { on, EventEmitter } = require('node:events'); const { on, EventEmitter } = require('node:events');
(async () => { (async () => {
@ -1127,8 +1388,36 @@ composed of the emitted event arguments.
An {AbortSignal} can be used to cancel waiting on events: An {AbortSignal} can be used to cancel waiting on events:
```js ```mjs
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
```
```cjs
const { on, EventEmitter } = require('node:events'); const { on, EventEmitter } = require('node:events');
const ac = new AbortController(); const ac = new AbortController();
(async () => { (async () => {
@ -1164,7 +1453,16 @@ added: v15.4.0
or {EventEmitter} instances. If none are specified, `n` is set as the default or {EventEmitter} instances. If none are specified, `n` is set as the default
max for all newly created {EventTarget} and {EventEmitter} objects. max for all newly created {EventTarget} and {EventEmitter} objects.
```js ```mjs
import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
```
```cjs
const { const {
setMaxListeners, setMaxListeners,
EventEmitter EventEmitter
@ -1188,7 +1486,36 @@ Integrates `EventEmitter` with {AsyncResource} for `EventEmitter`s that
require manual async tracking. Specifically, all events emitted by instances require manual async tracking. Specifically, all events emitted by instances
of `events.EventEmitterAsyncResource` will run within its [async context][]. of `events.EventEmitterAsyncResource` will run within its [async context][].
```js ```mjs
import { EventEmitterAsyncResource } from 'node:events';
import { notStrictEqual, strictEqual } from 'node:assert';
import { executionAsyncId } from 'node:async_hooks';
// Async tracking tooling will identify this as 'Q'.
const ee1 = new EventEmitterAsyncResource({ name: 'Q' });
// 'foo' listeners will run in the EventEmitters async context.
ee1.on('foo', () => {
strictEqual(executionAsyncId(), ee1.asyncId);
strictEqual(triggerAsyncId(), ee1.triggerAsyncId);
});
const ee2 = new EventEmitter();
// 'foo' listeners on ordinary EventEmitters that do not track async
// context, however, run in the same async context as the emit().
ee2.on('foo', () => {
notStrictEqual(executionAsyncId(), ee2.asyncId);
notStrictEqual(triggerAsyncId(), ee2.triggerAsyncId);
});
Promise.resolve().then(() => {
ee1.emit('foo');
ee2.emit('foo');
});
```
```cjs
const { EventEmitterAsyncResource } = require('node:events'); const { EventEmitterAsyncResource } = require('node:events');
const { notStrictEqual, strictEqual } = require('node:assert'); const { notStrictEqual, strictEqual } = require('node:assert');
const { executionAsyncId } = require('node:async_hooks'); const { executionAsyncId } = require('node:async_hooks');