Skip to content

Commit 2ef9594

Browse files
committed
fix: errors related to immediateFirstRun
1 parent 3694745 commit 2ef9594

File tree

4 files changed

+35
-18
lines changed

4 files changed

+35
-18
lines changed

packages/reactivity/__tests__/baseWatch.spec.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,13 @@ let isFlushPending = false
1515
const resolvedPromise = /*#__PURE__*/ Promise.resolve() as Promise<any>
1616
const nextTick = (fn?: () => any) =>
1717
fn ? resolvedPromise.then(fn) : resolvedPromise
18-
const scheduler: Scheduler = job => {
19-
queue.push(job)
20-
flushJobs()
18+
const scheduler: Scheduler = (job, effect, immediateFirstRun, hasCb) => {
19+
if (immediateFirstRun) {
20+
!hasCb && effect.run()
21+
} else {
22+
queue.push(() => job(immediateFirstRun))
23+
flushJobs()
24+
}
2125
}
2226
const flushJobs = () => {
2327
if (isFlushPending) return

packages/reactivity/src/baseWatch.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,24 @@ const INITIAL_WATCHER_VALUE = {}
8989
export type Scheduler = (
9090
job: SchedulerJob,
9191
effect: ReactiveEffect,
92-
isInit: boolean,
92+
immediateFirstRun: boolean,
93+
hasCb: boolean,
9394
) => void
9495
export type HandleError = (err: unknown, type: BaseWatchErrorCodes) => void
9596
export type HandleWarn = (msg: string, ...args: any[]) => void
9697

97-
const DEFAULT_SCHEDULER: Scheduler = job => job()
98+
const DEFAULT_SCHEDULER: Scheduler = (
99+
job,
100+
effect,
101+
immediateFirstRun,
102+
hasCb,
103+
) => {
104+
if (immediateFirstRun) {
105+
!hasCb && effect.run()
106+
} else {
107+
job()
108+
}
109+
}
98110
const DEFAULT_HANDLE_ERROR: HandleError = (err: unknown) => {
99111
throw err
100112
}
@@ -313,7 +325,7 @@ export function baseWatch(
313325
if (cb) job.flags! |= SchedulerJobFlags.ALLOW_RECURSE
314326

315327
effect = new ReactiveEffect(getter)
316-
effect.scheduler = () => scheduler(job, effect, false)
328+
effect.scheduler = () => scheduler(job, effect, false, !!cb)
317329

318330
cleanup = effect.onStop = () => {
319331
const cleanups = cleanupMap.get(effect)
@@ -336,13 +348,14 @@ export function baseWatch(
336348

337349
// initial run
338350
if (cb) {
351+
scheduler(job, effect, true, !!cb)
339352
if (immediate) {
340353
job(true)
341354
} else {
342355
oldValue = effect.run()
343356
}
344357
} else {
345-
scheduler(job, effect, true)
358+
scheduler(job, effect, true, !!cb)
346359
}
347360

348361
return effect

packages/runtime-core/src/renderer.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -289,14 +289,14 @@ export const queuePostRenderEffect = __FEATURE_SUSPENSE__
289289
: queuePostFlushCb
290290

291291
export const createPostRenderScheduler: SchedulerFactory =
292-
instance => (job, effect, isInit) => {
293-
if (isInit) {
292+
instance => (job, effect, immediateFirstRun, hasCb) => {
293+
if (!immediateFirstRun) {
294+
queuePostRenderEffect(job, instance && instance.suspense)
295+
} else if (!hasCb) {
294296
queuePostRenderEffect(
295297
effect.run.bind(effect),
296298
instance && instance.suspense,
297299
)
298-
} else {
299-
queuePostRenderEffect(job, instance && instance.suspense)
300300
}
301301
}
302302

packages/runtime-core/src/scheduler.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -304,22 +304,22 @@ export type SchedulerFactory = (
304304
) => Scheduler
305305

306306
export const createSyncScheduler: SchedulerFactory =
307-
instance => (job, effect, isInit) => {
308-
if (isInit) {
307+
instance => (job, effect, immediateFirstRun, hasCb) => {
308+
if (immediateFirstRun) {
309309
effect.flags |= EffectFlags.NO_BATCH
310-
effect.run()
310+
if (!hasCb) effect.run()
311311
} else {
312312
job()
313313
}
314314
}
315315

316316
export const createPreScheduler: SchedulerFactory =
317-
instance => (job, effect, isInit) => {
318-
if (isInit) {
319-
effect.run()
320-
} else {
317+
instance => (job, effect, immediateFirstRun, hasCb) => {
318+
if (!immediateFirstRun) {
321319
job.flags! |= SchedulerJobFlags.PRE
322320
if (instance) job.id = instance.uid
323321
queueJob(job)
322+
} else if (!hasCb) {
323+
effect.run()
324324
}
325325
}

0 commit comments

Comments
 (0)