@@ -39,6 +39,9 @@ export interface ReactiveEffectRunner<T = any> {
39
39
export let activeSub : Subscriber | undefined
40
40
41
41
export enum EffectFlags {
42
+ /**
43
+ * ReactiveEffect only
44
+ */
42
45
ACTIVE = 1 << 0 ,
43
46
RUNNING = 1 << 1 ,
44
47
TRACKING = 1 << 2 ,
@@ -69,7 +72,13 @@ export interface Subscriber extends DebuggerOptions {
69
72
/**
70
73
* @internal
71
74
*/
72
- notify ( ) : void
75
+ next ?: Subscriber
76
+ /**
77
+ * returning `true` indicates it's a computed that needs to call notify
78
+ * on its dep too
79
+ * @internal
80
+ */
81
+ notify ( ) : true | void
73
82
}
74
83
75
84
const pausedQueueEffects = new WeakSet < ReactiveEffect > ( )
@@ -92,7 +101,7 @@ export class ReactiveEffect<T = any>
92
101
/**
93
102
* @internal
94
103
*/
95
- nextEffect ?: ReactiveEffect = undefined
104
+ next ?: Subscriber = undefined
96
105
/**
97
106
* @internal
98
107
*/
@@ -134,9 +143,7 @@ export class ReactiveEffect<T = any>
134
143
return
135
144
}
136
145
if ( ! ( this . flags & EffectFlags . NOTIFIED ) ) {
137
- this . flags |= EffectFlags . NOTIFIED
138
- this . nextEffect = batchedEffect
139
- batchedEffect = this
146
+ batch ( this )
140
147
}
141
148
}
142
149
@@ -226,7 +233,13 @@ export class ReactiveEffect<T = any>
226
233
// }
227
234
228
235
let batchDepth = 0
229
- let batchedEffect : ReactiveEffect | undefined
236
+ let batchedSub : Subscriber | undefined
237
+
238
+ export function batch ( sub : Subscriber ) : void {
239
+ sub . flags |= EffectFlags . NOTIFIED
240
+ sub . next = batchedSub
241
+ batchedSub = sub
242
+ }
230
243
231
244
/**
232
245
* @internal
@@ -245,16 +258,17 @@ export function endBatch(): void {
245
258
}
246
259
247
260
let error : unknown
248
- while ( batchedEffect ) {
249
- let e : ReactiveEffect | undefined = batchedEffect
250
- batchedEffect = undefined
261
+ while ( batchedSub ) {
262
+ let e : Subscriber | undefined = batchedSub
263
+ batchedSub = undefined
251
264
while ( e ) {
252
- const next : ReactiveEffect | undefined = e . nextEffect
253
- e . nextEffect = undefined
265
+ const next : Subscriber | undefined = e . next
266
+ e . next = undefined
254
267
e . flags &= ~ EffectFlags . NOTIFIED
255
268
if ( e . flags & EffectFlags . ACTIVE ) {
256
269
try {
257
- e . trigger ( )
270
+ // ACTIVE flag is effect-only
271
+ ; ( e as ReactiveEffect ) . trigger ( )
258
272
} catch ( err ) {
259
273
if ( ! error ) error = err
260
274
}
0 commit comments