Browse Source

fix(runtime-core): avoid double firing when mounting inside a watcher callback

fix #6614
Evan You 3 years ago
parent
commit
6aaf8efeff

+ 12 - 0
packages/runtime-core/__tests__/scheduler.spec.ts

@@ -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)
+  })
 })

+ 5 - 1
packages/runtime-core/src/scheduler.ts

@@ -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()
   }