diff --git a/packages/runtime-core/__tests__/scheduler.spec.ts b/packages/runtime-core/__tests__/scheduler.spec.ts index 92727e99537..750a2ed19b5 100644 --- a/packages/runtime-core/__tests__/scheduler.spec.ts +++ b/packages/runtime-core/__tests__/scheduler.spec.ts @@ -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 () => { diff --git a/packages/runtime-core/src/scheduler.ts b/packages/runtime-core/src/scheduler.ts index e5ef4e849c7..78219736931 100644 --- a/packages/runtime-core/src/scheduler.ts +++ b/packages/runtime-core/src/scheduler.ts @@ -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( // 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) } }