Skip to content

Commit b56a118

Browse files
committed
:refactor: Use abortSignal for query cancellation in InfiniteQueryBehavior
1 parent ca56c55 commit b56a118

File tree

3 files changed

+17
-26
lines changed

3 files changed

+17
-26
lines changed

src/core/infiniteQueryBehavior.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,11 @@ export function infiniteQueryBehavior<
143143
pageParams: newPageParams,
144144
}))
145145

146-
const finalPromiseAsAny = finalPromise as any
147-
148-
finalPromiseAsAny.cancel = () => {
149-
cancelled = true
146+
context.signal?.addEventListener('abort', () => {
147+
cancelled = true;
150148
abortController?.abort()
151-
}
149+
})
150+
152151

153152
return finalPromise
154153
}

src/core/query.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export interface FetchContext<
6565
> {
6666
fetchFn: () => unknown | Promise<unknown>
6767
fetchOptions?: FetchOptions
68+
signal?: AbortSignal
6869
options: QueryOptions<TQueryFnData, TError, TData, any>
6970
queryKey: EnsuredQueryKey<TQueryKey>
7071
state: QueryState<TData, TError>
@@ -316,7 +317,7 @@ export class Query<
316317
// If the transport layer does not support cancellation
317318
// we'll let the query continue so the result can be cached
318319
if (this.retryer) {
319-
if (this.retryer.isTransportCancelable || this.abortSignalConsumed) {
320+
if (this.abortSignalConsumed) {
320321
this.retryer.cancel({ revert: true })
321322
} else {
322323
this.retryer.cancelRetry()
@@ -412,6 +413,17 @@ export class Query<
412413
meta: this.meta,
413414
}
414415

416+
Object.defineProperty(context, 'signal', {
417+
enumerable: true,
418+
get: () => {
419+
if (abortController) {
420+
this.abortSignalConsumed = true
421+
return abortController.signal
422+
}
423+
return undefined
424+
},
425+
})
426+
415427
if (this.options.behavior?.onFetch) {
416428
this.options.behavior?.onFetch(context)
417429
}

src/core/retryer.ts

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,6 @@ type RetryDelayFunction<TError = unknown> = (
3434
function defaultRetryDelay(failureCount: number) {
3535
return Math.min(1000 * 2 ** failureCount, 30000)
3636
}
37-
38-
interface Cancelable {
39-
cancel(): void
40-
}
41-
42-
export function isCancelable(value: any): value is Cancelable {
43-
return typeof value?.cancel === 'function'
44-
}
45-
4637
export class CancelledError {
4738
revert?: boolean
4839
silent?: boolean
@@ -65,7 +56,6 @@ export class Retryer<TData = unknown, TError = unknown> {
6556
failureCount: number
6657
isPaused: boolean
6758
isResolved: boolean
68-
isTransportCancelable: boolean
6959
promise: Promise<TData>
7060

7161
private abort?: () => void
@@ -86,7 +76,6 @@ export class Retryer<TData = unknown, TError = unknown> {
8676
this.failureCount = 0
8777
this.isPaused = false
8878
this.isResolved = false
89-
this.isTransportCancelable = false
9079
this.promise = new Promise<TData>((outerResolve, outerReject) => {
9180
promiseResolve = outerResolve
9281
promiseReject = outerReject
@@ -144,18 +133,9 @@ export class Retryer<TData = unknown, TError = unknown> {
144133
reject(new CancelledError(cancelOptions))
145134

146135
this.abort?.()
147-
148-
// Cancel transport if supported
149-
if (isCancelable(promiseOrValue)) {
150-
try {
151-
promiseOrValue.cancel()
152-
} catch {}
153-
}
154136
}
155137
}
156138

157-
// Check if the transport layer support cancellation
158-
this.isTransportCancelable = isCancelable(promiseOrValue)
159139

160140
Promise.resolve(promiseOrValue)
161141
.then(resolve)

0 commit comments

Comments
 (0)