[IMP] component: propagate error to mount and render

This commit is contained in:
Géry Debongnie
2019-10-26 16:44:12 +02:00
committed by Aaron Bohy
parent 2c563ee380
commit 9cee12d7b4
4 changed files with 127 additions and 31 deletions
+13 -5
View File
@@ -266,7 +266,7 @@ export class Component<T extends Env, Props extends {}> {
* It needs to be implemented by a component that is designed to handle the
* error properly.
*/
catchError?(error?: Error):void;
catchError?(error?: Error): void;
//--------------------------------------------------------------------------
// Public
@@ -298,8 +298,12 @@ export class Component<T extends Env, Props extends {}> {
} else {
this.__render(fiber);
}
return new Promise(resolve => {
scheduler.addFiber(fiber, () => {
return new Promise((resolve, reject) => {
scheduler.addFiber(fiber, err => {
if (err) {
reject(err);
return;
}
if (!__owl__.isDestroyed) {
this.__patch(fiber.vnode);
target.appendChild(this.el!);
@@ -342,8 +346,12 @@ export class Component<T extends Env, Props extends {}> {
}
const fiber = new Fiber(null, this, this.props, undefined, undefined, force);
this.__render(fiber);
return new Promise(resolve => {
scheduler.addFiber(fiber.root, () => {
return new Promise((resolve, reject) => {
scheduler.addFiber(fiber.root, err => {
if (err) {
reject(err);
return;
}
if (__owl__.isMounted && fiber === fiber.root) {
fiber.patchComponents();
}
+4 -1
View File
@@ -53,6 +53,8 @@ export class Fiber {
sibling: Fiber | null = null;
parent: Fiber | null = null;
error?: Error;
constructor(parent: Fiber | null, component: Component<any, any>, props, scope, vars, force) {
this.force = force;
this.scope = scope;
@@ -212,14 +214,15 @@ export class Fiber {
root = component;
component = component.__owl__.parent!;
}
console.error(error);
qweb.trigger("error", error);
if (canCatch) {
setTimeout(() => {
console.error(error);
component.catchError!(error);
});
} else {
this.root.error = error;
root.destroy();
}
}
+2 -2
View File
@@ -13,7 +13,7 @@ import { Fiber } from "./fiber";
interface Task {
fiber: Fiber;
callback: () => void;
callback: (err?: Error) => void;
}
export class Scheduler {
@@ -45,7 +45,7 @@ export class Scheduler {
return false;
}
if (task.fiber.counter === 0) {
task.callback();
task.callback(task.fiber.error);
return false;
}
return true;