]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): avoid double firing when mounting inside a watcher callback
authorEvan You <yyx990803@gmail.com>
Thu, 8 Sep 2022 01:59:51 +0000 (09:59 +0800)
committerEvan You <yyx990803@gmail.com>
Thu, 8 Sep 2022 01:59:51 +0000 (09:59 +0800)
fix #6614

packages/runtime-core/__tests__/scheduler.spec.ts
packages/runtime-core/src/scheduler.ts

index 1f7199f6edf64236a90a63f3a0ee5e9350ca5385..dc9bace9c9cba182613addb4535d6e4698094901 100644 (file)
@@ -534,4 +534,16 @@ describe('scheduler', () => {
     // should not be called
     expect(spy).toHaveBeenCalledTimes(0)
   })
+
+  it('flushPreFlushCbs inside a pre job', async () => {
+    const spy = jest.fn()
+    const job = () => {
+      spy()
+      flushPreFlushCbs()
+    }
+    job.pre = true
+    queueJob(job)
+    await nextTick()
+    expect(spy).toHaveBeenCalledTimes(1)
+  })
 })
index 109541d280b33d77f8864a224f9386bec13e43fd..923f3ec8251f3e3c2249ea9a10f298bae982359b 100644 (file)
@@ -133,7 +133,11 @@ export function queuePostFlushCb(cb: SchedulerJobs) {
   queueFlush()
 }
 
-export function flushPreFlushCbs(seen?: CountMap, i = flushIndex) {
+export function flushPreFlushCbs(
+  seen?: CountMap,
+  // if currently flushing, skip the current job itself
+  i = isFlushing ? flushIndex + 1 : 0
+) {
   if (__DEV__) {
     seen = seen || new Map()
   }