[IMP] component: render does not return a promise anymore

This commit is contained in:
Géry Debongnie
2021-11-29 16:02:51 +01:00
committed by Aaron Bohy
parent 8a1ac13975
commit eceb3e6280
14 changed files with 103 additions and 208 deletions
+2 -2
View File
@@ -26,7 +26,7 @@ export class Component {
setup() {}
render(): Promise<void> {
return this.__owl__.render();
render() {
this.__owl__.render();
}
}
+1 -3
View File
@@ -139,10 +139,9 @@ export class ComponentNode<T extends typeof Component = typeof Component>
async render() {
const current = this.fiber;
if (current && !current.bdom && !fibersInError.has(current)) {
return current.root.promise;
return;
}
if (!this.bdom && !current) {
// should find a way to return the future mounting promise
return;
}
const fiber = makeRootFiber(this);
@@ -166,7 +165,6 @@ export class ComponentNode<T extends typeof Component = typeof Component>
if (this.fiber && (current || !fiber.parent)) {
this._render(fiber);
}
return fiber.root.promise;
}
_render(fiber: Fiber | RootFiber) {
+11 -18
View File
@@ -33,7 +33,7 @@ export function makeRootFiber(node: ComponentNode): Fiber {
}
return current;
}
const fiber = new RootFiber(node);
const fiber = new RootFiber(node, null);
if (node.willPatch.length) {
fiber.willPatch.push(fiber);
}
@@ -84,25 +84,12 @@ export class Fiber {
export class RootFiber extends Fiber {
counter: number = 1;
resolve: any;
promise: Promise<any>;
reject: any;
// only add stuff in this if they have registered some hooks
willPatch: Fiber[] = [];
patched: Fiber[] = [];
mounted: Fiber[] = [];
constructor(node: ComponentNode) {
super(node, null);
this.counter = 1;
this.promise = new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
}
complete() {
const node = this.node;
let current: Fiber | undefined = undefined;
@@ -150,9 +137,7 @@ export class RootFiber extends Fiber {
// unregistering the fiber
node.fiber = null;
} catch (e) {
if (!handleError({ fiber: current || this, error: e })) {
this.reject(e);
}
handleError({ fiber: current || this, error: e });
}
}
}
@@ -166,11 +151,18 @@ export interface MountOptions {
export class MountFiber extends RootFiber {
target: HTMLElement;
position: Position;
resolve: any;
promise: Promise<any>;
reject: any;
constructor(node: ComponentNode, target: HTMLElement, options: MountOptions = {}) {
super(node);
super(node, null);
this.target = target;
this.position = options.position || "last-child";
this.promise = new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
}
complete() {
let current: Fiber | undefined = this;
@@ -199,5 +191,6 @@ export class MountFiber extends RootFiber {
this.reject(e);
}
}
this.resolve();
}
}
+4 -9
View File
@@ -1,4 +1,4 @@
import { Fiber, RootFiber } from "./fibers";
import { Fiber, MountFiber, RootFiber } from "./fibers";
import { fibersInError } from "./error_handling";
import { STATUS } from "./status";
@@ -38,19 +38,15 @@ export class Scheduler {
flush() {
this.tasks.forEach((fiber) => {
if (fiber.root !== fiber) {
// this is wrong! should be something like
// if (this.tasks.has(fiber.root)) {
// // parent rendering has completed
// fiber.resolve();
// this.tasks.delete(fiber);
// }
this.tasks.delete(fiber);
return;
}
const hasError = fibersInError.has(fiber);
if (hasError && fiber.counter !== 0) {
this.tasks.delete(fiber);
fiber.reject(fibersInError.get(fiber));
if (fiber instanceof MountFiber) {
fiber.reject(fibersInError.get(fiber));
}
return;
}
if (fiber.node.status === STATUS.DESTROYED) {
@@ -61,7 +57,6 @@ export class Scheduler {
if (fiber.counter === 0) {
if (!hasError) {
fiber.complete();
fiber.resolve();
}
this.tasks.delete(fiber);
}