events: add once method to use promises with EventEmitter · nodejs/node@df55731 (original) (raw)
``
1
`+
'use strict';
`
``
2
+
``
3
`+
const common = require('../common');
`
``
4
`+
const { once, EventEmitter } = require('events');
`
``
5
`+
const { strictEqual, deepStrictEqual } = require('assert');
`
``
6
+
``
7
`+
async function onceAnEvent() {
`
``
8
`+
const ee = new EventEmitter();
`
``
9
+
``
10
`+
process.nextTick(() => {
`
``
11
`+
ee.emit('myevent', 42);
`
``
12
`+
});
`
``
13
+
``
14
`+
const [value] = await once(ee, 'myevent');
`
``
15
`+
strictEqual(value, 42);
`
``
16
`+
strictEqual(ee.listenerCount('error'), 0);
`
``
17
`+
strictEqual(ee.listenerCount('myevent'), 0);
`
``
18
`+
}
`
``
19
+
``
20
`+
async function onceAnEventWithTwoArgs() {
`
``
21
`+
const ee = new EventEmitter();
`
``
22
+
``
23
`+
process.nextTick(() => {
`
``
24
`+
ee.emit('myevent', 42, 24);
`
``
25
`+
});
`
``
26
+
``
27
`+
const value = await once(ee, 'myevent');
`
``
28
`+
deepStrictEqual(value, [42, 24]);
`
``
29
`+
}
`
``
30
+
``
31
`+
async function catchesErrors() {
`
``
32
`+
const ee = new EventEmitter();
`
``
33
+
``
34
`+
const expected = new Error('kaboom');
`
``
35
`+
let err;
`
``
36
`+
process.nextTick(() => {
`
``
37
`+
ee.emit('error', expected);
`
``
38
`+
});
`
``
39
+
``
40
`+
try {
`
``
41
`+
await once(ee, 'myevent');
`
``
42
`+
} catch (_e) {
`
``
43
`+
err = _e;
`
``
44
`+
}
`
``
45
`+
strictEqual(err, expected);
`
``
46
`+
strictEqual(ee.listenerCount('error'), 0);
`
``
47
`+
strictEqual(ee.listenerCount('myevent'), 0);
`
``
48
`+
}
`
``
49
+
``
50
`+
async function stopListeningAfterCatchingError() {
`
``
51
`+
const ee = new EventEmitter();
`
``
52
+
``
53
`+
const expected = new Error('kaboom');
`
``
54
`+
let err;
`
``
55
`+
process.nextTick(() => {
`
``
56
`+
ee.emit('error', expected);
`
``
57
`+
ee.emit('myevent', 42, 24);
`
``
58
`+
});
`
``
59
+
``
60
`+
process.on('multipleResolves', common.mustNotCall());
`
``
61
+
``
62
`+
try {
`
``
63
`+
await once(ee, 'myevent');
`
``
64
`+
} catch (_e) {
`
``
65
`+
err = _e;
`
``
66
`+
}
`
``
67
`+
process.removeAllListeners('multipleResolves');
`
``
68
`+
strictEqual(err, expected);
`
``
69
`+
strictEqual(ee.listenerCount('error'), 0);
`
``
70
`+
strictEqual(ee.listenerCount('myevent'), 0);
`
``
71
`+
}
`
``
72
+
``
73
`+
async function onceError() {
`
``
74
`+
const ee = new EventEmitter();
`
``
75
+
``
76
`+
const expected = new Error('kaboom');
`
``
77
`+
process.nextTick(() => {
`
``
78
`+
ee.emit('error', expected);
`
``
79
`+
});
`
``
80
+
``
81
`+
const [err] = await once(ee, 'error');
`
``
82
`+
strictEqual(err, expected);
`
``
83
`+
strictEqual(ee.listenerCount('error'), 0);
`
``
84
`+
strictEqual(ee.listenerCount('myevent'), 0);
`
``
85
`+
}
`
``
86
+
``
87
`+
Promise.all([
`
``
88
`+
onceAnEvent(),
`
``
89
`+
onceAnEventWithTwoArgs(),
`
``
90
`+
catchesErrors(),
`
``
91
`+
stopListeningAfterCatchingError(),
`
``
92
`+
onceError()
`
``
93
`+
]);
`