File tree Expand file tree Collapse file tree 2 files changed +32
-5
lines changed Expand file tree Collapse file tree 2 files changed +32
-5
lines changed Original file line number Diff line number Diff line change @@ -44,6 +44,7 @@ export default function pTimeout(promise, options) {
44
44
} = options ;
45
45
46
46
let timer ;
47
+ let abortHandler ;
47
48
48
49
const wrappedPromise = new Promise ( ( resolve , reject ) => {
49
50
if ( typeof milliseconds !== 'number' || Math . sign ( milliseconds ) !== 1 ) {
@@ -56,15 +57,11 @@ export default function pTimeout(promise, options) {
56
57
reject ( getAbortedReason ( signal ) ) ;
57
58
}
58
59
59
- const abortHandler = ( ) => {
60
+ abortHandler = ( ) => {
60
61
reject ( getAbortedReason ( signal ) ) ;
61
62
} ;
62
63
63
64
signal . addEventListener ( 'abort' , abortHandler , { once : true } ) ;
64
-
65
- promise . finally ( ( ) => {
66
- signal . removeEventListener ( 'abort' , abortHandler ) ;
67
- } ) ;
68
65
}
69
66
70
67
if ( milliseconds === Number . POSITIVE_INFINITY ) {
@@ -111,6 +108,9 @@ export default function pTimeout(promise, options) {
111
108
112
109
const cancelablePromise = wrappedPromise . finally ( ( ) => {
113
110
cancelablePromise . clear ( ) ;
111
+ if ( abortHandler && options . signal ) {
112
+ options . signal . removeEventListener ( 'abort' , abortHandler ) ;
113
+ }
114
114
} ) ;
115
115
116
116
cancelablePromise . clear = ( ) => {
Original file line number Diff line number Diff line change @@ -165,4 +165,31 @@ if (globalThis.AbortController !== undefined) {
165
165
addEventListenerSpy . restore ( ) ;
166
166
removeEventListenerSpy . restore ( ) ;
167
167
} ) ;
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
+ } ) ;
168
195
}
You can’t perform that action at this time.
0 commit comments