mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[FIX] remove cyclic dependency, improve error typing (#982)
This commit is contained in:
@@ -127,7 +127,7 @@ export class ComponentNode<T extends typeof Component = any> implements VNode<Co
|
|||||||
try {
|
try {
|
||||||
await Promise.all(this.willStart.map((f) => f.call(component)));
|
await Promise.all(this.willStart.map((f) => f.call(component)));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
handleError(this, e as Error);
|
handleError({ node: this, error: e });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.status === STATUS.NEW && this.fiber === fiber) {
|
if (this.status === STATUS.NEW && this.fiber === fiber) {
|
||||||
@@ -161,7 +161,7 @@ export class ComponentNode<T extends typeof Component = any> implements VNode<Co
|
|||||||
fiber.bdom = this.renderFn();
|
fiber.bdom = this.renderFn();
|
||||||
fiber.root.counter--;
|
fiber.root.counter--;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
handleError(this, e as Error);
|
handleError({ node: this, error: e });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import type { ComponentNode } from "./component_node";
|
import type { ComponentNode } from "./component_node";
|
||||||
import { Fiber } from "./fibers";
|
import type { Fiber } from "./fibers";
|
||||||
|
|
||||||
export const fibersInError: WeakMap<Fiber, Error> = new WeakMap();
|
// Maps fibers to thrown errors
|
||||||
export const nodeErrorHandlers: WeakMap<ComponentNode, ((error: Error) => void)[]> = new WeakMap();
|
export const fibersInError: WeakMap<Fiber, any> = new WeakMap();
|
||||||
|
export const nodeErrorHandlers: WeakMap<ComponentNode, ((error: any) => void)[]> = new WeakMap();
|
||||||
|
|
||||||
function _handleError(node: ComponentNode | null, error: Error, isFirstRound = false): boolean {
|
function _handleError(node: ComponentNode | null, error: any, isFirstRound = false): boolean {
|
||||||
if (!node) {
|
if (!node) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -38,16 +39,12 @@ function _handleError(node: ComponentNode | null, error: Error, isFirstRound = f
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function handleError(entity: ComponentNode | Fiber, error: Error) {
|
type ErrorParams = { error: any } & ({ node: ComponentNode } | { fiber: Fiber });
|
||||||
let node: ComponentNode;
|
export function handleError(params: ErrorParams) {
|
||||||
let fiber: Fiber;
|
const error = params.error;
|
||||||
if (entity instanceof Fiber) {
|
const node = "node" in params ? params.node : params.fiber.node;
|
||||||
fiber = entity;
|
const fiber = "fiber" in params ? params.fiber : node.fiber!;
|
||||||
node = entity.node;
|
|
||||||
} else {
|
|
||||||
node = entity;
|
|
||||||
fiber = entity.fiber!;
|
|
||||||
}
|
|
||||||
fibersInError.set(fiber.root, error);
|
fibersInError.set(fiber.root, error);
|
||||||
|
|
||||||
const handled = _handleError(node, error, true);
|
const handled = _handleError(node, error, true);
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ export class RootFiber extends Fiber {
|
|||||||
// unregistering the fiber
|
// unregistering the fiber
|
||||||
node.fiber = null;
|
node.fiber = null;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (!handleError(current || this, e)) {
|
if (!handleError({ fiber: current || this, error: e })) {
|
||||||
this.reject(e);
|
this.reject(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -206,7 +206,7 @@ export class MountFiber extends RootFiber {
|
|||||||
}
|
}
|
||||||
node.fiber = null;
|
node.fiber = null;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (!handleError(current as Fiber, e)) {
|
if (!handleError({ fiber: current as Fiber, error: e })) {
|
||||||
this.reject(e);
|
this.reject(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user