Skip to content

Commit e3fdb74

Browse files
authored
Merge pull request #279 from DoubleData/feature/respect-abort-signal
Clear abort listener
2 parents 028888c + 43530f4 commit e3fdb74

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

spec/index.spec.ts

+28
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,34 @@ describe('axiosRetry(axios, { retries, retryCondition })', () => {
382382
setTimeout(() => abortController.abort(), 50);
383383
const timeStart = new Date().getTime();
384384
});
385+
386+
it('should cancel old requests', (done) => {
387+
const client = axios.create();
388+
setupResponses(client, [
389+
() => nock('http://example.com').get('/test').delay(100).reply(429),
390+
() => nock('http://example.com').get('/test').delay(100).reply(429),
391+
() => nock('http://example.com').get('/test').delay(100).reply(429)
392+
]);
393+
axiosRetry(client, {
394+
retries: 2,
395+
retryCondition: () => true,
396+
retryDelay: () => 0
397+
});
398+
const abortController = new AbortController();
399+
client
400+
.get('http://example.com/test', { signal: abortController.signal })
401+
.then(
402+
() => done.fail(),
403+
(error) => {
404+
expect(error).toBeInstanceOf(CanceledError);
405+
expect(new Date().getTime() - timeStart).toBeLessThan(300);
406+
done();
407+
}
408+
)
409+
.catch(done.fail);
410+
setTimeout(() => abortController.abort(), 250);
411+
const timeStart = new Date().getTime();
412+
});
385413
});
386414
});
387415

src/index.ts

+12-10
Original file line numberDiff line numberDiff line change
@@ -255,17 +255,19 @@ async function handleRetry(
255255
if (config.signal?.aborted) {
256256
return Promise.resolve(axiosInstance(config));
257257
}
258-
return new Promise((resolve, reject) => {
259-
const timeout = setTimeout(() => resolve(axiosInstance(config)), delay);
258+
return new Promise((resolve) => {
259+
const abortListener = () => {
260+
clearTimeout(timeout);
261+
resolve(axiosInstance(config));
262+
};
263+
const timeout = setTimeout(() => {
264+
resolve(axiosInstance(config));
265+
if (config.signal?.removeEventListener) {
266+
config.signal.removeEventListener('abort', abortListener);
267+
}
268+
}, delay);
260269
if (config.signal?.addEventListener) {
261-
config.signal.addEventListener(
262-
'abort',
263-
() => {
264-
clearTimeout(timeout);
265-
resolve(axiosInstance(config));
266-
},
267-
{ once: true }
268-
);
270+
config.signal.addEventListener('abort', abortListener, { once: true });
269271
}
270272
});
271273
}

0 commit comments

Comments
 (0)