Skip to content

Commit 589cd11

Browse files
committed
fix: errors related to immediateFirstRun
1 parent 3694745 commit 589cd11

File tree

4 files changed

+37
-19
lines changed

4 files changed

+37
-19
lines changed

packages/reactivity/__tests__/baseWatch.spec.ts

+7-3
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

+19-5
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ export enum BaseWatchErrorCodes {
3333
WATCH_CLEANUP,
3434
}
3535

36-
export enum SchedulerJobFlags {
36+
// TODO move to a scheduler package
37+
enum SchedulerJobFlags {
3738
QUEUED = 1 << 0,
3839
PRE = 1 << 1,
3940
/**
@@ -89,12 +90,24 @@ const INITIAL_WATCHER_VALUE = {}
8990
export type Scheduler = (
9091
job: SchedulerJob,
9192
effect: ReactiveEffect,
92-
isInit: boolean,
93+
immediateFirstRun: boolean,
94+
hasCb: boolean,
9395
) => void
9496
export type HandleError = (err: unknown, type: BaseWatchErrorCodes) => void
9597
export type HandleWarn = (msg: string, ...args: any[]) => void
9698

97-
const DEFAULT_SCHEDULER: Scheduler = job => job()
99+
const DEFAULT_SCHEDULER: Scheduler = (
100+
job,
101+
effect,
102+
immediateFirstRun,
103+
hasCb,
104+
) => {
105+
if (immediateFirstRun) {
106+
!hasCb && effect.run()
107+
} else {
108+
job()
109+
}
110+
}
98111
const DEFAULT_HANDLE_ERROR: HandleError = (err: unknown) => {
99112
throw err
100113
}
@@ -313,7 +326,7 @@ export function baseWatch(
313326
if (cb) job.flags! |= SchedulerJobFlags.ALLOW_RECURSE
314327

315328
effect = new ReactiveEffect(getter)
316-
effect.scheduler = () => scheduler(job, effect, false)
329+
effect.scheduler = () => scheduler(job, effect, false, !!cb)
317330

318331
cleanup = effect.onStop = () => {
319332
const cleanups = cleanupMap.get(effect)
@@ -336,13 +349,14 @@ export function baseWatch(
336349

337350
// initial run
338351
if (cb) {
352+
scheduler(job, effect, true, !!cb)
339353
if (immediate) {
340354
job(true)
341355
} else {
342356
oldValue = effect.run()
343357
}
344358
} else {
345-
scheduler(job, effect, true)
359+
scheduler(job, effect, true, !!cb)
346360
}
347361

348362
return effect

packages/runtime-core/src/renderer.ts

+4-4
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

+7-7
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)