From 36fa42a88cf3a72b58e507b82b35c56a42e43f09 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 24 Aug 2020 18:46:53 -0400 Subject: [PATCH] fix(runtime-core/scheduler): handle nested flushPostFlushCbs calls fix #1947 --- .../runtime-core/__tests__/scheduler.spec.ts | 23 ++++++++++++++++++- packages/runtime-core/src/scheduler.ts | 11 ++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/__tests__/scheduler.spec.ts b/packages/runtime-core/__tests__/scheduler.spec.ts index 53b0890f..39f4de98 100644 --- a/packages/runtime-core/__tests__/scheduler.spec.ts +++ b/packages/runtime-core/__tests__/scheduler.spec.ts @@ -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) + }) }) diff --git a/packages/runtime-core/src/scheduler.ts b/packages/runtime-core/src/scheduler.ts index 9120c3bf..43b88ae0 100644 --- a/packages/runtime-core/src/scheduler.ts +++ b/packages/runtime-core/src/scheduler.ts @@ -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