queuePostFlushCb,
invalidateJob,
queuePreFlushCb,
- flushPreFlushCbs
+ flushPreFlushCbs,
+ flushPostFlushCbs
} from '../src/scheduler'
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)
+ })
})
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()
}
if (__DEV__) {
checkRecursiveUpdates(seen!, activePostFlushCbs[postFlushIndex])
}
+ console.log(postFlushIndex)
activePostFlushCbs[postFlushIndex]()
}
activePostFlushCbs = null