From 77a1198c19879bdd7c6a54fcc7e96530c2a051f3 Mon Sep 17 00:00:00 2001 From: daiwei Date: Sat, 30 Jan 2021 21:41:24 +0800 Subject: [PATCH] fix(runtime-core): handle error in async watchEffect --- .../__tests__/errorHandling.spec.ts | 49 ++++++++++++++++++- packages/runtime-core/src/apiWatch.ts | 2 +- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/__tests__/errorHandling.spec.ts b/packages/runtime-core/__tests__/errorHandling.spec.ts index 36e3f6fcd6c..10d28e441ea 100644 --- a/packages/runtime-core/__tests__/errorHandling.spec.ts +++ b/packages/runtime-core/__tests__/errorHandling.spec.ts @@ -8,7 +8,8 @@ import { ref, nextTick, defineComponent, - watchEffect + watchEffect, + createApp } from '@vue/runtime-test' describe('error handling', () => { @@ -536,5 +537,51 @@ describe('error handling', () => { log.mockRestore() }) + //# 3127 + test('handle error in watch & watchEffect', async () => { + const error1 = new Error('error1') + const error2 = new Error('error2') + const error3 = new Error('error3') + const error4 = new Error('error4') + const handler = jest.fn() + + const app = createApp({ + setup() { + const count = ref(1) + watch( + count, + () => { + throw error1 + }, + { immediate: true } + ) + watch( + count, + async () => { + throw error2 + }, + { immediate: true } + ) + watchEffect(() => { + throw error3 + }) + watchEffect(async () => { + throw error4 + }) + }, + render() {} + }) + + app.config.errorHandler = handler + app.mount(nodeOps.createElement('div')) + + await nextTick() + expect(handler).toHaveBeenCalledWith(error1, {}, 'watcher callback') + expect(handler).toHaveBeenCalledWith(error2, {}, 'watcher callback') + expect(handler).toHaveBeenCalledWith(error3, {}, 'watcher callback') + expect(handler).toHaveBeenCalledWith(error4, {}, 'watcher callback') + expect(handler).toHaveBeenCalledTimes(4) + }) + // native event handler handling should be tested in respective renderers }) diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index f0ff31fcfdd..549ad5f822d 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -200,7 +200,7 @@ function doWatch( if (cleanup) { cleanup() } - return callWithErrorHandling( + return callWithAsyncErrorHandling( source, instance, ErrorCodes.WATCH_CALLBACK,