[FIX] remove cyclic dependency, improve error typing (#982)

This commit is contained in:
Géry Debongnie
2021-11-18 10:44:49 +01:00
committed by GitHub
parent c2284bc6f5
commit 93b53d8017
3 changed files with 15 additions and 18 deletions
+2 -2
View File
@@ -127,7 +127,7 @@ export class ComponentNode<T extends typeof Component = any> implements VNode<Co
try {
await Promise.all(this.willStart.map((f) => f.call(component)));
} catch (e) {
handleError(this, e as Error);
handleError({ node: this, error: e });
return;
}
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.root.counter--;
} catch (e) {
handleError(this, e as Error);
handleError({ node: this, error: e });
}
}
+11 -14
View File
@@ -1,10 +1,11 @@
import type { ComponentNode } from "./component_node";
import { Fiber } from "./fibers";
import type { Fiber } from "./fibers";
export const fibersInError: WeakMap<Fiber, Error> = new WeakMap();
export const nodeErrorHandlers: WeakMap<ComponentNode, ((error: Error) => void)[]> = new WeakMap();
// Maps fibers to thrown errors
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) {
return false;
}
@@ -38,16 +39,12 @@ function _handleError(node: ComponentNode | null, error: Error, isFirstRound = f
}
}
export function handleError(entity: ComponentNode | Fiber, error: Error) {
let node: ComponentNode;
let fiber: Fiber;
if (entity instanceof Fiber) {
fiber = entity;
node = entity.node;
} else {
node = entity;
fiber = entity.fiber!;
}
type ErrorParams = { error: any } & ({ node: ComponentNode } | { fiber: Fiber });
export function handleError(params: ErrorParams) {
const error = params.error;
const node = "node" in params ? params.node : params.fiber.node;
const fiber = "fiber" in params ? params.fiber : node.fiber!;
fibersInError.set(fiber.root, error);
const handled = _handleError(node, error, true);
+2 -2
View File
@@ -159,7 +159,7 @@ export class RootFiber extends Fiber {
// unregistering the fiber
node.fiber = null;
} catch (e) {
if (!handleError(current || this, e)) {
if (!handleError({ fiber: current || this, error: e })) {
this.reject(e);
}
}
@@ -206,7 +206,7 @@ export class MountFiber extends RootFiber {
}
node.fiber = null;
} catch (e) {
if (!handleError(current as Fiber, e)) {
if (!handleError({ fiber: current as Fiber, error: e })) {
this.reject(e);
}
}