diff --git a/src/component/component.ts b/src/component/component.ts index bdd0b43b..34e73de3 100644 --- a/src/component/component.ts +++ b/src/component/component.ts @@ -572,6 +572,7 @@ export class Component { if (__owl__.observer) { __owl__.observer.allowMutations = false; } + let error; try { let vnode = __owl__.renderFn!(this, { handlers: __owl__.boundHandlers, @@ -582,7 +583,7 @@ export class Component { } fiber.vnode = vnode; } catch (e) { - fiber.handleError(e); + error = e; } if (__owl__.observer) { __owl__.observer.allowMutations = true; @@ -597,6 +598,9 @@ export class Component { } fiber.root.counter--; fiber.isRendered = true; + if (error) { + fiber.handleError(error); + } } /** diff --git a/src/component/fiber.ts b/src/component/fiber.ts index 9326dff4..0afc9e55 100644 --- a/src/component/fiber.ts +++ b/src/component/fiber.ts @@ -253,10 +253,7 @@ export class Fiber { qweb.trigger("error", error); if (canCatch) { - setTimeout(() => { - console.error(error); - component.catchError!(error); - }); + component.catchError!(error); } else { // the 3 next lines aim to mark the root fiber as being in error, and // to force it to end, without waiting for its children diff --git a/tests/component/component.test.ts b/tests/component/component.test.ts index 7e5e11df..b41e015b 100644 --- a/tests/component/component.test.ts +++ b/tests/component/component.test.ts @@ -4401,11 +4401,9 @@ describe("component error handling (catchError)", () => { expect(fixture.innerHTML).toBe("
hey
"); app.state.flag = true; await nextTick(); - await nextTick(); - await nextTick(); expect(fixture.innerHTML).toBe("
Error handled
"); - expect(console.error).toBeCalledTimes(1); + expect(console.error).toBeCalledTimes(0); console.error = consoleError; expect(handler).toBeCalledTimes(1); }); @@ -4438,8 +4436,6 @@ describe("component error handling (catchError)", () => { expect(fixture.innerHTML).toBe("
hey
"); app.state.flag = true; await nextTick(); - await nextTick(); - await nextTick(); expect(fixture.innerHTML).toBe(""); expect(console.error).toBeCalledTimes(0); @@ -4477,12 +4473,9 @@ describe("component error handling (catchError)", () => { } const app = new App(); await app.mount(fixture); - await nextTick(); - await nextTick(); - await nextTick(); expect(fixture.innerHTML).toBe("
Error handled
"); - expect(console.error).toBeCalledTimes(1); + expect(console.error).toBeCalledTimes(0); console.error = consoleError; expect(handler).toBeCalledTimes(1); }); @@ -4521,12 +4514,9 @@ describe("component error handling (catchError)", () => { } const app = new App(); await app.mount(fixture); - await nextTick(); - await nextTick(); - await nextTick(); expect(fixture.innerHTML).toBe("
Error handled
"); - expect(console.error).toBeCalledTimes(1); + expect(console.error).toBeCalledTimes(0); console.error = consoleError; expect(handler).toBeCalledTimes(1); }); @@ -4560,12 +4550,9 @@ describe("component error handling (catchError)", () => { } const app = new App(); await app.mount(fixture); - await nextTick(); - await nextTick(); - await nextTick(); expect(fixture.innerHTML).toBe("
Error handled
"); - expect(console.error).toBeCalledTimes(1); + expect(console.error).toBeCalledTimes(0); console.error = consoleError; });