summaryrefslogtreecommitdiff
path: root/test/parallel/test-events-once.js
diff options
context:
space:
mode:
authorMatteo Collina <hello@matteocollina.com>2019-02-13 13:30:28 +0100
committerMatteo Collina <hello@matteocollina.com>2019-03-02 19:17:45 +0100
commitb1ef279d5726905d7941f4a58978b379daa3cdc4 (patch)
tree64e9150dd69203663f8ac0f90aca1c41cfac9621 /test/parallel/test-events-once.js
parent2a5edafabd2cce9cff59321f0b492fa50af2e705 (diff)
downloadandroid-node-v8-b1ef279d5726905d7941f4a58978b379daa3cdc4.tar.gz
android-node-v8-b1ef279d5726905d7941f4a58978b379daa3cdc4.tar.bz2
android-node-v8-b1ef279d5726905d7941f4a58978b379daa3cdc4.zip
events: add once method to use promises with EventEmitter
This change adds a EventEmitter.once() method that wraps ee.once in a promise. Co-authored-by: David Mark Clements <david.mark.clements@gmail.com> PR-URL: https://github.com/nodejs/node/pull/26078 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com>
Diffstat (limited to 'test/parallel/test-events-once.js')
-rw-r--r--test/parallel/test-events-once.js93
1 files changed, 93 insertions, 0 deletions
diff --git a/test/parallel/test-events-once.js b/test/parallel/test-events-once.js
new file mode 100644
index 0000000000..f99604018a
--- /dev/null
+++ b/test/parallel/test-events-once.js
@@ -0,0 +1,93 @@
+'use strict';
+
+const common = require('../common');
+const { once, EventEmitter } = require('events');
+const { strictEqual, deepStrictEqual } = require('assert');
+
+async function onceAnEvent() {
+ const ee = new EventEmitter();
+
+ process.nextTick(() => {
+ ee.emit('myevent', 42);
+ });
+
+ const [value] = await once(ee, 'myevent');
+ strictEqual(value, 42);
+ strictEqual(ee.listenerCount('error'), 0);
+ strictEqual(ee.listenerCount('myevent'), 0);
+}
+
+async function onceAnEventWithTwoArgs() {
+ const ee = new EventEmitter();
+
+ process.nextTick(() => {
+ ee.emit('myevent', 42, 24);
+ });
+
+ const value = await once(ee, 'myevent');
+ deepStrictEqual(value, [42, 24]);
+}
+
+async function catchesErrors() {
+ const ee = new EventEmitter();
+
+ const expected = new Error('kaboom');
+ let err;
+ process.nextTick(() => {
+ ee.emit('error', expected);
+ });
+
+ try {
+ await once(ee, 'myevent');
+ } catch (_e) {
+ err = _e;
+ }
+ strictEqual(err, expected);
+ strictEqual(ee.listenerCount('error'), 0);
+ strictEqual(ee.listenerCount('myevent'), 0);
+}
+
+async function stopListeningAfterCatchingError() {
+ const ee = new EventEmitter();
+
+ const expected = new Error('kaboom');
+ let err;
+ process.nextTick(() => {
+ ee.emit('error', expected);
+ ee.emit('myevent', 42, 24);
+ });
+
+ process.on('multipleResolves', common.mustNotCall());
+
+ try {
+ await once(ee, 'myevent');
+ } catch (_e) {
+ err = _e;
+ }
+ process.removeAllListeners('multipleResolves');
+ strictEqual(err, expected);
+ strictEqual(ee.listenerCount('error'), 0);
+ strictEqual(ee.listenerCount('myevent'), 0);
+}
+
+async function onceError() {
+ const ee = new EventEmitter();
+
+ const expected = new Error('kaboom');
+ process.nextTick(() => {
+ ee.emit('error', expected);
+ });
+
+ const [err] = await once(ee, 'error');
+ strictEqual(err, expected);
+ strictEqual(ee.listenerCount('error'), 0);
+ strictEqual(ee.listenerCount('myevent'), 0);
+}
+
+Promise.all([
+ onceAnEvent(),
+ onceAnEventWithTwoArgs(),
+ catchesErrors(),
+ stopListeningAfterCatchingError(),
+ onceError()
+]);