@@ -18,6 +18,7 @@ import type {
18
18
import type { Query , QueryState , Action , FetchOptions } from './query'
19
19
import type { QueryClient } from './queryClient'
20
20
import { focusManager } from './focusManager'
21
+ import { Subscribable } from './subscribable'
21
22
22
23
type QueryObserverListener < TData , TError > = (
23
24
result : QueryObserverResult < TData , TError >
@@ -39,15 +40,14 @@ export class QueryObserver<
39
40
TError = unknown ,
40
41
TQueryFnData = TData ,
41
42
TQueryData = TQueryFnData
42
- > {
43
+ > extends Subscribable < QueryObserverListener < TData , TError > > {
43
44
options : QueryObserverOptions < TData , TError , TQueryFnData , TQueryData >
44
45
45
46
private client : QueryClient
46
47
private currentQuery ! : Query < TQueryData , TError , TQueryFnData >
47
48
private currentResult ! : QueryObserverResult < TData , TError >
48
49
private currentResultState ?: QueryState < TQueryData , TError >
49
50
private previousQueryResult ?: QueryObserverResult < TData , TError >
50
- private listeners : QueryObserverListener < TData , TError > [ ]
51
51
private initialDataUpdateCount : number
52
52
private staleTimeoutId ?: number
53
53
private refetchIntervalId ?: number
@@ -56,9 +56,10 @@ export class QueryObserver<
56
56
client : QueryClient ,
57
57
options : QueryObserverOptions < TData , TError , TQueryFnData , TQueryData >
58
58
) {
59
+ super ( )
60
+
59
61
this . client = client
60
62
this . options = options
61
- this . listeners = [ ]
62
63
this . initialDataUpdateCount = 0
63
64
64
65
// Bind exposed methods
@@ -76,11 +77,7 @@ export class QueryObserver<
76
77
this . setOptions ( options )
77
78
}
78
79
79
- subscribe ( listener ?: QueryObserverListener < TData , TError > ) : ( ) => void {
80
- const callback = listener || ( ( ) => undefined )
81
-
82
- this . listeners . push ( callback )
83
-
80
+ protected onSubscribe ( ) : void {
84
81
if ( this . listeners . length === 1 ) {
85
82
this . currentQuery . addObserver ( this )
86
83
@@ -90,14 +87,9 @@ export class QueryObserver<
90
87
91
88
this . updateTimers ( )
92
89
}
93
-
94
- return ( ) => {
95
- this . unsubscribe ( callback )
96
- }
97
90
}
98
91
99
- private unsubscribe ( listener : QueryObserverListener < TData , TError > ) : void {
100
- this . listeners = this . listeners . filter ( x => x !== listener )
92
+ protected onUnsubscribe ( ) : void {
101
93
if ( ! this . listeners . length ) {
102
94
this . destroy ( )
103
95
}
0 commit comments