]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core/scheduler): handle nested flushPostFlushCbs calls
authorEvan You <yyx990803@gmail.com>
Mon, 24 Aug 2020 22:46:53 +0000 (18:46 -0400)
committerEvan You <yyx990803@gmail.com>
Mon, 24 Aug 2020 22:47:15 +0000 (18:47 -0400)
fix #1947

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

index 53b0890fd7c913fb46125c7f11bf77e1e25c2faf..39f4de981a4af86b4770ac4ddc6150884b5abaad 100644 (file)
@@ -4,7 +4,8 @@ import {
   queuePostFlushCb,
   invalidateJob,
   queuePreFlushCb,
-  flushPreFlushCbs
+  flushPreFlushCbs,
+  flushPostFlushCbs
 } from '../src/scheduler'
 
 describe('scheduler', () => {
@@ -505,4 +506,24 @@ describe('scheduler', () => {
     await nextTick()
     expect(count).toBe(1)
   })
+
+  // #1947 flushPostFlushCbs should handle nested calls
+  // e.g. app.mount inside app.mount
+  test('flushPostFlushCbs', async () => {
+    let count = 0
+
+    const queueAndFlush = (hook: Function) => {
+      queuePostFlushCb(hook)
+      flushPostFlushCbs()
+    }
+
+    queueAndFlush(() => {
+      queueAndFlush(() => {
+        count++
+      })
+    })
+
+    await nextTick()
+    expect(count).toBe(1)
+  })
 })
index 9120c3bf174f2205a54e2fd5459b5de2b9a661ba..43b88ae0e36e2726f89e571b0d954f51c7b0f8c0 100644 (file)
@@ -151,8 +151,16 @@ export function flushPreFlushCbs(
 
 export function flushPostFlushCbs(seen?: CountMap) {
   if (pendingPostFlushCbs.length) {
-    activePostFlushCbs = [...new Set(pendingPostFlushCbs)]
+    const deduped = [...new Set(pendingPostFlushCbs)]
     pendingPostFlushCbs.length = 0
+
+    // #1947 already has active queue, nested flushPostFlushCbs call
+    if (activePostFlushCbs) {
+      activePostFlushCbs.push(...deduped)
+      return
+    }
+
+    activePostFlushCbs = deduped
     if (__DEV__) {
       seen = seen || new Map()
     }
@@ -167,6 +175,7 @@ export function flushPostFlushCbs(seen?: CountMap) {
       if (__DEV__) {
         checkRecursiveUpdates(seen!, activePostFlushCbs[postFlushIndex])
       }
+      console.log(postFlushIndex)
       activePostFlushCbs[postFlushIndex]()
     }
     activePostFlushCbs = null