diff --git a/lib/events.js b/lib/events.js index 8beb501678f647..75baac156aaf86 100644 --- a/lib/events.js +++ b/lib/events.js @@ -736,7 +736,7 @@ async function once(emitter, name, options = {}) { } function abortListener() { eventTargetAgnosticRemoveListener(emitter, name, resolver); - eventTargetAgnosticRemoveListener(emitter, 'error', resolver); + eventTargetAgnosticRemoveListener(emitter, 'error', errorListener); reject(lazyDOMException('The operation was aborted', 'AbortError')); } if (signal != null) { diff --git a/test/parallel/test-events-once.js b/test/parallel/test-events-once.js index 7c37f576c29fd3..14b8ea5815a61a 100644 --- a/test/parallel/test-events-once.js +++ b/test/parallel/test-events-once.js @@ -169,6 +169,19 @@ async function abortSignalAfterEvent() { await once(ee, 'foo', { signal: ac.signal }); } +async function abortSignalRemoveListener() { + const ee = new EventEmitter(); + const ac = new AbortController(); + + try { + process.nextTick(() => ac.abort()); + await once(ee, 'test', { signal: ac.signal }); + } catch { + strictEqual(ee.listeners('test').length, 0); + strictEqual(ee.listeners('error').length, 0); + } +} + async function eventTargetAbortSignalBefore() { const et = new EventTarget(); const ac = new AbortController(); @@ -218,6 +231,7 @@ Promise.all([ abortSignalBefore(), abortSignalAfter(), abortSignalAfterEvent(), + abortSignalRemoveListener(), eventTargetAbortSignalBefore(), eventTargetAbortSignalAfter(), eventTargetAbortSignalAfterEvent(),