Skip to content

Commit fd93994

Browse files
authored
Fix removing abort listener after promise rejects (#44)
1 parent 3cabb7a commit fd93994

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

index.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export default function pTimeout(promise, options) {
4444
} = options;
4545

4646
let timer;
47+
let abortHandler;
4748

4849
const wrappedPromise = new Promise((resolve, reject) => {
4950
if (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {
@@ -56,15 +57,11 @@ export default function pTimeout(promise, options) {
5657
reject(getAbortedReason(signal));
5758
}
5859

59-
const abortHandler = () => {
60+
abortHandler = () => {
6061
reject(getAbortedReason(signal));
6162
};
6263

6364
signal.addEventListener('abort', abortHandler, {once: true});
64-
65-
promise.finally(() => {
66-
signal.removeEventListener('abort', abortHandler);
67-
});
6865
}
6966

7067
if (milliseconds === Number.POSITIVE_INFINITY) {
@@ -111,6 +108,9 @@ export default function pTimeout(promise, options) {
111108

112109
const cancelablePromise = wrappedPromise.finally(() => {
113110
cancelablePromise.clear();
111+
if (abortHandler && options.signal) {
112+
options.signal.removeEventListener('abort', abortHandler);
113+
}
114114
});
115115

116116
cancelablePromise.clear = () => {

test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,31 @@ if (globalThis.AbortController !== undefined) {
165165
addEventListenerSpy.restore();
166166
removeEventListenerSpy.restore();
167167
});
168+
169+
test('removes abort listener after promise rejects', async t => {
170+
const abortController = new AbortController();
171+
const {signal} = abortController;
172+
173+
const addEventListenerSpy = sinon.spy(signal, 'addEventListener');
174+
const removeEventListenerSpy = sinon.spy(signal, 'removeEventListener');
175+
176+
const promise = pTimeout(
177+
(async () => {
178+
await delay(50);
179+
throw new Error('Test error');
180+
})(),
181+
{
182+
milliseconds: 100,
183+
signal,
184+
},
185+
);
186+
187+
await t.throwsAsync(promise, {message: 'Test error'});
188+
189+
t.true(addEventListenerSpy.calledWith('abort'), 'addEventListener should be called with "abort"');
190+
t.true(removeEventListenerSpy.calledWith('abort'), 'removeEventListener should be called with "abort"');
191+
192+
addEventListenerSpy.restore();
193+
removeEventListenerSpy.restore();
194+
});
168195
}

0 commit comments

Comments
 (0)