|
@@ -39,6 +39,9 @@ export interface ReactiveEffectRunner<T = any> {
|
|
|
export let activeSub: Subscriber | undefined
|
|
export let activeSub: Subscriber | undefined
|
|
|
|
|
|
|
|
export enum EffectFlags {
|
|
export enum EffectFlags {
|
|
|
|
|
+ /**
|
|
|
|
|
+ * ReactiveEffect only
|
|
|
|
|
+ */
|
|
|
ACTIVE = 1 << 0,
|
|
ACTIVE = 1 << 0,
|
|
|
RUNNING = 1 << 1,
|
|
RUNNING = 1 << 1,
|
|
|
TRACKING = 1 << 2,
|
|
TRACKING = 1 << 2,
|
|
@@ -69,7 +72,13 @@ export interface Subscriber extends DebuggerOptions {
|
|
|
/**
|
|
/**
|
|
|
* @internal
|
|
* @internal
|
|
|
*/
|
|
*/
|
|
|
- notify(): void
|
|
|
|
|
|
|
+ next?: Subscriber
|
|
|
|
|
+ /**
|
|
|
|
|
+ * returning `true` indicates it's a computed that needs to call notify
|
|
|
|
|
+ * on its dep too
|
|
|
|
|
+ * @internal
|
|
|
|
|
+ */
|
|
|
|
|
+ notify(): true | void
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const pausedQueueEffects = new WeakSet<ReactiveEffect>()
|
|
const pausedQueueEffects = new WeakSet<ReactiveEffect>()
|
|
@@ -92,7 +101,7 @@ export class ReactiveEffect<T = any>
|
|
|
/**
|
|
/**
|
|
|
* @internal
|
|
* @internal
|
|
|
*/
|
|
*/
|
|
|
- nextEffect?: ReactiveEffect = undefined
|
|
|
|
|
|
|
+ next?: Subscriber = undefined
|
|
|
/**
|
|
/**
|
|
|
* @internal
|
|
* @internal
|
|
|
*/
|
|
*/
|
|
@@ -134,9 +143,7 @@ export class ReactiveEffect<T = any>
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
if (!(this.flags & EffectFlags.NOTIFIED)) {
|
|
if (!(this.flags & EffectFlags.NOTIFIED)) {
|
|
|
- this.flags |= EffectFlags.NOTIFIED
|
|
|
|
|
- this.nextEffect = batchedEffect
|
|
|
|
|
- batchedEffect = this
|
|
|
|
|
|
|
+ batch(this)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -226,7 +233,13 @@ export class ReactiveEffect<T = any>
|
|
|
// }
|
|
// }
|
|
|
|
|
|
|
|
let batchDepth = 0
|
|
let batchDepth = 0
|
|
|
-let batchedEffect: ReactiveEffect | undefined
|
|
|
|
|
|
|
+let batchedSub: Subscriber | undefined
|
|
|
|
|
+
|
|
|
|
|
+export function batch(sub: Subscriber): void {
|
|
|
|
|
+ sub.flags |= EffectFlags.NOTIFIED
|
|
|
|
|
+ sub.next = batchedSub
|
|
|
|
|
+ batchedSub = sub
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @internal
|
|
* @internal
|
|
@@ -245,16 +258,17 @@ export function endBatch(): void {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
let error: unknown
|
|
let error: unknown
|
|
|
- while (batchedEffect) {
|
|
|
|
|
- let e: ReactiveEffect | undefined = batchedEffect
|
|
|
|
|
- batchedEffect = undefined
|
|
|
|
|
|
|
+ while (batchedSub) {
|
|
|
|
|
+ let e: Subscriber | undefined = batchedSub
|
|
|
|
|
+ batchedSub = undefined
|
|
|
while (e) {
|
|
while (e) {
|
|
|
- const next: ReactiveEffect | undefined = e.nextEffect
|
|
|
|
|
- e.nextEffect = undefined
|
|
|
|
|
|
|
+ const next: Subscriber | undefined = e.next
|
|
|
|
|
+ e.next = undefined
|
|
|
e.flags &= ~EffectFlags.NOTIFIED
|
|
e.flags &= ~EffectFlags.NOTIFIED
|
|
|
if (e.flags & EffectFlags.ACTIVE) {
|
|
if (e.flags & EffectFlags.ACTIVE) {
|
|
|
try {
|
|
try {
|
|
|
- e.trigger()
|
|
|
|
|
|
|
+ // ACTIVE flag is effect-only
|
|
|
|
|
+ ;(e as ReactiveEffect).trigger()
|
|
|
} catch (err) {
|
|
} catch (err) {
|
|
|
if (!error) error = err
|
|
if (!error) error = err
|
|
|
}
|
|
}
|