Skip to content

Commit df56cc5

Browse files
authoredSep 5, 2024··
fix(scheduler): prevent duplicate jobs being queued (#11826)
Fix #11712 Fix #11807
1 parent e84c4a6 commit df56cc5

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed
 

‎packages/runtime-core/src/scheduler.ts

+20-6
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,8 @@ export function queueJob(job: SchedulerJob): void {
108108
queue.splice(findInsertionIndex(jobId), 0, job)
109109
}
110110

111-
if (!(job.flags! & SchedulerJobFlags.ALLOW_RECURSE)) {
112-
job.flags! |= SchedulerJobFlags.QUEUED
113-
}
111+
job.flags! |= SchedulerJobFlags.QUEUED
112+
114113
queueFlush()
115114
}
116115
}
@@ -128,9 +127,7 @@ export function queuePostFlushCb(cb: SchedulerJobs): void {
128127
activePostFlushCbs.splice(postFlushIndex + 1, 0, cb)
129128
} else if (!(cb.flags! & SchedulerJobFlags.QUEUED)) {
130129
pendingPostFlushCbs.push(cb)
131-
if (!(cb.flags! & SchedulerJobFlags.ALLOW_RECURSE)) {
132-
cb.flags! |= SchedulerJobFlags.QUEUED
133-
}
130+
cb.flags! |= SchedulerJobFlags.QUEUED
134131
}
135132
} else {
136133
// if cb is an array, it is a component lifecycle hook which can only be
@@ -161,6 +158,9 @@ export function flushPreFlushCbs(
161158
}
162159
queue.splice(i, 1)
163160
i--
161+
if (cb.flags! & SchedulerJobFlags.ALLOW_RECURSE) {
162+
cb.flags! &= ~SchedulerJobFlags.QUEUED
163+
}
164164
cb()
165165
cb.flags! &= ~SchedulerJobFlags.QUEUED
166166
}
@@ -194,6 +194,9 @@ export function flushPostFlushCbs(seen?: CountMap): void {
194194
if (__DEV__ && checkRecursiveUpdates(seen!, cb)) {
195195
continue
196196
}
197+
if (cb.flags! & SchedulerJobFlags.ALLOW_RECURSE) {
198+
cb.flags! &= ~SchedulerJobFlags.QUEUED
199+
}
197200
if (!(cb.flags! & SchedulerJobFlags.DISPOSED)) cb()
198201
cb.flags! &= ~SchedulerJobFlags.QUEUED
199202
}
@@ -228,6 +231,9 @@ function flushJobs(seen?: CountMap) {
228231
if (__DEV__ && check(job)) {
229232
continue
230233
}
234+
if (job.flags! & SchedulerJobFlags.ALLOW_RECURSE) {
235+
job.flags! &= ~SchedulerJobFlags.QUEUED
236+
}
231237
callWithErrorHandling(
232238
job,
233239
job.i,
@@ -237,6 +243,14 @@ function flushJobs(seen?: CountMap) {
237243
}
238244
}
239245
} finally {
246+
// If there was an error we still need to clear the QUEUED flags
247+
for (; flushIndex < queue.length; flushIndex++) {
248+
const job = queue[flushIndex]
249+
if (job) {
250+
job.flags! &= ~SchedulerJobFlags.QUEUED
251+
}
252+
}
253+
240254
flushIndex = 0
241255
queue.length = 0
242256

0 commit comments

Comments
 (0)
Please sign in to comment.