queueJob(job2)
queueJob(job3)
- queueJob(job4)
}
const job2 = () => {
calls.push('job2')
+ queueJob(job4)
+ queueJob(job5)
}
job2.id = 10
}
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 () => {
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.
// 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
)) &&
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()
}
if (__DEV__ && checkRecursiveUpdates(seen!, job)) {
continue
}
+ // console.log(`running:`, job.id)
callWithErrorHandling(job, null, ErrorCodes.SCHEDULER)
}
}