[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 { 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 });
} }
} }
+11 -14
View File
@@ -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);
+2 -2
View File
@@ -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);
} }
} }