@@ -34,6 +34,8 @@ import {
34
34
35
35
const kScheduler = Symbol . for ( 'kScheduler' ) ;
36
36
37
+ type OnCancelCallback = ( ( ) => void ) | undefined ;
38
+
37
39
export async function setTimeout < T = void > (
38
40
delay : number | undefined ,
39
41
value ?: T ,
@@ -62,16 +64,23 @@ export async function setTimeout<T = void>(
62
64
}
63
65
64
66
const { promise, resolve, reject } = Promise . withResolvers < T > ( ) ;
67
+ let onCancel : OnCancelCallback ;
65
68
66
69
const timer = timers . setTimeout ( ( ) => {
67
70
resolve ( value as T ) ;
71
+ if ( onCancel ) {
72
+ signal ?. removeEventListener ( 'abort' , onCancel ) ;
73
+ }
68
74
} , delay ?? 0 ) ;
69
75
70
76
if ( signal ) {
71
- function onCancel ( ) : void {
77
+ onCancel = ( ) : void => {
72
78
timers . clearTimeout ( timer ) ;
73
- reject ( new AbortError ( undefined , { cause : signal ?. reason } ) ) ;
74
- }
79
+ if ( onCancel ) {
80
+ signal . removeEventListener ( 'abort' , onCancel ) ;
81
+ }
82
+ reject ( new AbortError ( undefined , { cause : signal . reason } ) ) ;
83
+ } ;
75
84
signal . addEventListener ( 'abort' , onCancel ) ;
76
85
}
77
86
@@ -101,17 +110,23 @@ export async function setImmediate<T>(
101
110
}
102
111
103
112
const { promise, resolve, reject } = Promise . withResolvers < T > ( ) ;
113
+ let onCancel : OnCancelCallback ;
104
114
105
115
const timer = globalThis . setImmediate ( ( ) => {
106
116
resolve ( value as T ) ;
117
+ if ( onCancel ) {
118
+ signal ?. removeEventListener ( 'abort' , onCancel ) ;
119
+ }
107
120
} ) ;
108
121
109
122
if ( signal ) {
110
- function onCancel ( ) : void {
123
+ onCancel = ( ) : void => {
111
124
globalThis . clearImmediate ( timer ) ;
112
- signal ?. removeEventListener ( 'abort' , onCancel ) ;
113
- reject ( new AbortError ( undefined , { cause : signal ?. reason } ) ) ;
114
- }
125
+ if ( onCancel ) {
126
+ signal . removeEventListener ( 'abort' , onCancel ) ;
127
+ }
128
+ reject ( new AbortError ( undefined , { cause : signal . reason } ) ) ;
129
+ } ;
115
130
signal . addEventListener ( 'abort' , onCancel ) ;
116
131
}
117
132
@@ -144,7 +159,7 @@ export async function* setInterval<T = void>(
144
159
throw new AbortError ( undefined , { cause : signal . reason } ) ;
145
160
}
146
161
147
- let onCancel : ( ( ) => void ) | undefined ;
162
+ let onCancel : OnCancelCallback ;
148
163
let interval : timers . Timeout ;
149
164
try {
150
165
let notYielded = 0 ;
@@ -164,8 +179,9 @@ export async function* setInterval<T = void>(
164
179
if ( signal ) {
165
180
onCancel = ( ) : void => {
166
181
timers . clearInterval ( interval ) ;
167
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
168
- signal . removeEventListener ( 'abort' , onCancel ! ) ;
182
+ if ( onCancel ) {
183
+ signal . removeEventListener ( 'abort' , onCancel ) ;
184
+ }
169
185
callback ?.(
170
186
Promise . reject ( new AbortError ( undefined , { cause : signal . reason } ) )
171
187
) ;
0 commit comments