Bläddra i källkod

fix(scheduler): handle preFlush cb queued inside postFlush cb

fix #3806
Evan You 4 år sedan
förälder
incheckning
b57e995edd

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

@@ -230,6 +230,16 @@ describe('scheduler', () => {
       await nextTick()
       expect(calls).toEqual(['cb1', 'cb2', 'job1'])
     })
+
+    // #3806
+    it('queue preFlushCb inside postFlushCb', async () => {
+      const cb = jest.fn()
+      queuePostFlushCb(() => {
+        queuePreFlushCb(cb)
+      })
+      await nextTick()
+      expect(cb).toHaveBeenCalled()
+    })
   })
 
   describe('queuePostFlushCb', () => {

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

@@ -260,7 +260,11 @@ function flushJobs(seen?: CountMap) {
     currentFlushPromise = null
     // some postFlushCb queued jobs!
     // keep flushing until it drains.
-    if (queue.length || pendingPostFlushCbs.length) {
+    if (
+      queue.length ||
+      pendingPreFlushCbs.length ||
+      pendingPostFlushCbs.length
+    ) {
       flushJobs(seen)
     }
   }