@@ -58,6 +58,7 @@ export function isCancelledError(value: any): value is CancelledError {
58
58
59
59
export class Retryer < TData = unknown , TError = unknown > {
60
60
cancel : ( options ?: CancelOptions ) => void
61
+ cancelRetry : ( ) => void
61
62
continue : ( ) => void
62
63
failureCount : number
63
64
isPaused : boolean
@@ -66,12 +67,16 @@ export class Retryer<TData = unknown, TError = unknown> {
66
67
promise : Promise < TData >
67
68
68
69
constructor ( config : RetryerConfig < TData , TError > ) {
70
+ let cancelRetry = false
69
71
let cancelFn : ( ( options ?: CancelOptions ) => void ) | undefined
70
72
let continueFn : ( ( ) => void ) | undefined
71
73
let promiseResolve : ( data : TData ) => void
72
74
let promiseReject : ( error : TError ) => void
73
75
74
76
this . cancel = cancelOptions => cancelFn ?.( cancelOptions )
77
+ this . cancelRetry = ( ) => {
78
+ cancelRetry = true
79
+ }
75
80
this . continue = ( ) => continueFn ?.( )
76
81
this . failureCount = 0
77
82
this . isPaused = false
@@ -154,7 +159,7 @@ export class Retryer<TData = unknown, TError = unknown> {
154
159
( typeof retry === 'number' && this . failureCount < retry ) ||
155
160
( typeof retry === 'function' && retry ( this . failureCount , error ) )
156
161
157
- if ( ! shouldRetry ) {
162
+ if ( cancelRetry || ! shouldRetry ) {
158
163
// We are done if the query does not need to be retried
159
164
reject ( error )
160
165
return
@@ -173,8 +178,13 @@ export class Retryer<TData = unknown, TError = unknown> {
173
178
return pause ( )
174
179
}
175
180
} )
176
- // Try again
177
- . then ( run )
181
+ . then ( ( ) => {
182
+ if ( cancelRetry ) {
183
+ reject ( error )
184
+ } else {
185
+ run ( )
186
+ }
187
+ } )
178
188
} )
179
189
}
180
190
0 commit comments