diff --git a/packages/runtime-core/__tests__/apiWatch.spec.ts b/packages/runtime-core/__tests__/apiWatch.spec.ts index 3deb2122..07b985c3 100644 --- a/packages/runtime-core/__tests__/apiWatch.spec.ts +++ b/packages/runtime-core/__tests__/apiWatch.spec.ts @@ -611,4 +611,23 @@ describe('api: watch', () => { oldValue: 2 }) }) + + it('should work sync', () => { + const v = ref(1) + let calls = 0 + + watch( + v, + () => { + ++calls + }, + { + flush: 'sync' + } + ) + + expect(calls).toBe(0) + v.value++ + expect(calls).toBe(1) + }) }) diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index f3a58431..fcc8c320 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -71,8 +71,6 @@ export interface WatchOptions extends WatchOptionsBase { export type WatchStopHandle = () => void -const invoke = (fn: Function) => fn() - // Simple effect. export function watchEffect( effect: WatchEffect, @@ -262,7 +260,7 @@ function doWatch( let scheduler: (job: () => any) => void if (flush === 'sync') { - scheduler = invoke + scheduler = job } else if (flush === 'pre') { // ensure it's queued before component updates (which have positive ids) job.id = -1