diff options
author | Matteo Collina <hello@matteocollina.com> | 2019-02-13 13:30:28 +0100 |
---|---|---|
committer | Matteo Collina <hello@matteocollina.com> | 2019-03-02 19:17:45 +0100 |
commit | b1ef279d5726905d7941f4a58978b379daa3cdc4 (patch) | |
tree | 64e9150dd69203663f8ac0f90aca1c41cfac9621 /test/parallel/test-events-once.js | |
parent | 2a5edafabd2cce9cff59321f0b492fa50af2e705 (diff) | |
download | android-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.js | 93 |
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() +]); |