@@ -2,6 +2,7 @@ import { focusManager } from './focusManager'
2
2
import { onlineManager } from './onlineManager'
3
3
import { pendingThenable } from './thenable'
4
4
import { isServer , sleep } from './utils'
5
+ import type { Thenable } from './thenable'
5
6
import type { CancelOptions , DefaultError , NetworkMode } from './types'
6
7
7
8
// TYPES
@@ -27,6 +28,7 @@ export interface Retryer<TData = unknown> {
27
28
continueRetry : ( ) => void
28
29
canStart : ( ) => boolean
29
30
start : ( ) => Promise < TData >
31
+ status : ( ) => 'pending' | 'resolved' | 'rejected'
30
32
}
31
33
32
34
export type RetryValue < TError > = boolean | number | ShouldRetryFunction < TError >
@@ -75,13 +77,15 @@ export function createRetryer<TData = unknown, TError = DefaultError>(
75
77
) : Retryer < TData > {
76
78
let isRetryCancelled = false
77
79
let failureCount = 0
78
- let isResolved = false
79
80
let continueFn : ( ( value ?: unknown ) => void ) | undefined
80
81
81
82
const thenable = pendingThenable < TData > ( )
82
83
84
+ const isResolved = ( ) =>
85
+ ( thenable . status as Thenable < TData > [ 'status' ] ) !== 'pending'
86
+
83
87
const cancel = ( cancelOptions ?: CancelOptions ) : void => {
84
- if ( ! isResolved ) {
88
+ if ( ! isResolved ( ) ) {
85
89
reject ( new CancelledError ( cancelOptions ) )
86
90
87
91
config . abort ?.( )
@@ -103,16 +107,14 @@ export function createRetryer<TData = unknown, TError = DefaultError>(
103
107
const canStart = ( ) => canFetch ( config . networkMode ) && config . canRun ( )
104
108
105
109
const resolve = ( value : any ) => {
106
- if ( ! isResolved ) {
107
- isResolved = true
110
+ if ( ! isResolved ( ) ) {
108
111
continueFn ?.( )
109
112
thenable . resolve ( value )
110
113
}
111
114
}
112
115
113
116
const reject = ( value : any ) => {
114
- if ( ! isResolved ) {
115
- isResolved = true
117
+ if ( ! isResolved ( ) ) {
116
118
continueFn ?.( )
117
119
thenable . reject ( value )
118
120
}
@@ -121,14 +123,14 @@ export function createRetryer<TData = unknown, TError = DefaultError>(
121
123
const pause = ( ) => {
122
124
return new Promise ( ( continueResolve ) => {
123
125
continueFn = ( value ) => {
124
- if ( isResolved || canContinue ( ) ) {
126
+ if ( isResolved ( ) || canContinue ( ) ) {
125
127
continueResolve ( value )
126
128
}
127
129
}
128
130
config . onPause ?.( )
129
131
} ) . then ( ( ) => {
130
132
continueFn = undefined
131
- if ( ! isResolved ) {
133
+ if ( ! isResolved ( ) ) {
132
134
config . onContinue ?.( )
133
135
}
134
136
} )
@@ -137,7 +139,7 @@ export function createRetryer<TData = unknown, TError = DefaultError>(
137
139
// Create loop function
138
140
const run = ( ) => {
139
141
// Do nothing if already resolved
140
- if ( isResolved ) {
142
+ if ( isResolved ( ) ) {
141
143
return
142
144
}
143
145
@@ -158,7 +160,7 @@ export function createRetryer<TData = unknown, TError = DefaultError>(
158
160
. then ( resolve )
159
161
. catch ( ( error ) => {
160
162
// Stop if the fetch is already resolved
161
- if ( isResolved ) {
163
+ if ( isResolved ( ) ) {
162
164
return
163
165
}
164
166
@@ -203,6 +205,7 @@ export function createRetryer<TData = unknown, TError = DefaultError>(
203
205
204
206
return {
205
207
promise : thenable ,
208
+ status : ( ) => thenable . status ,
206
209
cancel,
207
210
continue : ( ) => {
208
211
continueFn ?.( )
0 commit comments