]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(scheduler): fix insertion for id-less job
authorEvan You <yyx990803@gmail.com>
Mon, 19 Jul 2021 17:37:35 +0000 (13:37 -0400)
committerEvan You <yyx990803@gmail.com>
Mon, 19 Jul 2021 17:37:38 +0000 (13:37 -0400)
fix #4148

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

index 92727e9953782fecb3ac632a714acff22200c4da..750a2ed19b5fb8f9f7ecc1004d9804773764d01a 100644 (file)
@@ -51,11 +51,12 @@ describe('scheduler', () => {
 
         queueJob(job2)
         queueJob(job3)
-        queueJob(job4)
       }
 
       const job2 = () => {
         calls.push('job2')
+        queueJob(job4)
+        queueJob(job5)
       }
       job2.id = 10
 
@@ -64,16 +65,19 @@ describe('scheduler', () => {
       }
       job3.id = 1
 
-      // job4 gets the Infinity as it's id
       const job4 = () => {
         calls.push('job4')
       }
 
+      const job5 = () => {
+        calls.push('job5')
+      }
+
       queueJob(job1)
 
       expect(calls).toEqual([])
       await nextTick()
-      expect(calls).toEqual(['job1', 'job3', 'job2', 'job4'])
+      expect(calls).toEqual(['job1', 'job3', 'job2', 'job4', 'job5'])
     })
 
     it('should dedupe queued jobs', async () => {
index e5ef4e849c7d2e11fad7d4f34c53e05b74c8a88d..78219736931347ee63404c0f252e997b642adaeb 100644 (file)
@@ -10,6 +10,7 @@ setComputedScheduler(queueJob)
 export interface SchedulerJob extends Function {
   id?: number
   active?: boolean
+  computed?: boolean
   /**
    * Indicates whether the effect is allowed to recursively trigger itself
    * when managed by the scheduler.
@@ -70,16 +71,15 @@ export function nextTick<T = void>(
 // Use binary-search to find a suitable position in the queue,
 // so that the queue maintains the increasing order of job's id,
 // which can prevent the job from being skipped and also can avoid repeated patching.
-function findInsertionIndex(job: SchedulerJob) {
+function findInsertionIndex(id: number) {
   // the start index should be `flushIndex + 1`
   let start = flushIndex + 1
   let end = queue.length
-  const jobId = getId(job)
 
   while (start < end) {
     const middle = (start + end) >>> 1
     const middleJobId = getId(queue[middle])
-    middleJobId < jobId ? (start = middle + 1) : (end = middle)
+    middleJobId < id ? (start = middle + 1) : (end = middle)
   }
 
   return start
@@ -100,11 +100,10 @@ export function queueJob(job: SchedulerJob) {
       )) &&
     job !== currentPreFlushParentJob
   ) {
-    const pos = findInsertionIndex(job)
-    if (pos > -1) {
-      queue.splice(pos, 0, job)
-    } else {
+    if (job.id == null) {
       queue.push(job)
+    } else {
+      queue.splice(findInsertionIndex(job.id), 0, job)
     }
     queueFlush()
   }
@@ -253,6 +252,7 @@ function flushJobs(seen?: CountMap) {
         if (__DEV__ && checkRecursiveUpdates(seen!, job)) {
           continue
         }
+        // console.log(`running:`, job.id)
         callWithErrorHandling(job, null, ErrorCodes.SCHEDULER)
       }
     }