while (batchedSub) {
let e: Subscriber | undefined = batchedSub
let next: Subscriber | undefined
+ // 1st pass: clear notified flags for computed upfront
+ // we use the ACTIVE flag as a discriminator between computed and effect,
+ // since NOTIFIED is useless for an inactive effect anyway.
while (e) {
- e.flags &= ~EffectFlags.NOTIFIED
+ if (!(e.flags & EffectFlags.ACTIVE)) {
+ e.flags &= ~EffectFlags.NOTIFIED
+ }
e = e.next
}
e = batchedSub
batchedSub = undefined
+ // 2nd pass: run effects
while (e) {
+ e.flags &= ~EffectFlags.NOTIFIED
if (e.flags & EffectFlags.ACTIVE) {
try {
// ACTIVE flag is effect-only
warn.mockRestore()
})
- it('should be executed correctly', () => {
+ test('should be executed correctly', () => {
const v = ref(1)
let foo = ''
v.value++
expect(foo).toBe('12')
})
+
+ // 12045
+ test('sync watcher should not break pre watchers', async () => {
+ const count1 = ref(0)
+ const count2 = ref(0)
+
+ watch(
+ count1,
+ () => {
+ count2.value++
+ },
+ { flush: 'sync' },
+ )
+
+ const spy1 = vi.fn()
+ watch([count1, count2], spy1)
+
+ const spy2 = vi.fn()
+ watch(count1, spy2)
+
+ count1.value++
+
+ await nextTick()
+ expect(spy1).toHaveBeenCalled()
+ expect(spy2).toHaveBeenCalled()
+ })
})