From 21b1aa3a565d5f4b5dfb698a18c230be775a660a Mon Sep 17 00:00:00 2001 From: * <8> Date: Wed, 26 Jan 2022 17:43:53 +0800 Subject: [PATCH] Match-id-c9a7495e252e4e9c279e1a95f9d466f6985902e5 --- libs/horizon/src/renderer/ErrorHandler.ts | 7 ++++--- libs/horizon/src/renderer/TreeBuilder.ts | 10 ++-------- .../src/renderer/render/SuspenseComponent.ts | 4 ++-- libs/horizon/src/renderer/submit/Submit.ts | 4 ++-- .../src/renderer/taskExecutor/RenderQueue.ts | 14 +++----------- 5 files changed, 13 insertions(+), 26 deletions(-) diff --git a/libs/horizon/src/renderer/ErrorHandler.ts b/libs/horizon/src/renderer/ErrorHandler.ts index f4e66484..0e472f16 100644 --- a/libs/horizon/src/renderer/ErrorHandler.ts +++ b/libs/horizon/src/renderer/ErrorHandler.ts @@ -8,10 +8,11 @@ import type {Update} from './UpdateHandler'; import {ClassComponent, TreeRoot} from './vnode/VNodeTags'; import {FlagUtils, Interrupted} from './vnode/VNodeFlags'; import {newUpdate, UpdateState, pushUpdate} from './UpdateHandler'; -import {launchUpdateFromVNode, setBuildResultError, tryRenderRoot} from './TreeBuilder'; +import {launchUpdateFromVNode, tryRenderFromRoot} from './TreeBuilder'; import {setRootThrowError} from './submit/Submit'; import {handleSuspenseChildThrowError} from './render/SuspenseComponent'; import {updateShouldUpdateOfTree} from './vnode/VNodeShouldUpdate'; +import {BuildErrored, setBuildResult} from './GlobalVar'; // 处理capture和bubble阶段抛出的错误 export function handleRenderThrowError( @@ -33,7 +34,7 @@ export function handleRenderThrowError( } // 抛出错误无法作为suspense内容处理(或无suspense来处理),这次当成真的错误来处理 - setBuildResultError(); + setBuildResult(BuildErrored); // 向上遍历寻找ClassComponent组件(同时也是Error Boundaries组件) 或者 TreeRoot let vNode = sourceVNode.parent; @@ -167,7 +168,7 @@ function triggerUpdate(vNode, state) { const root = updateShouldUpdateOfTree(vNode); if (root !== null) { - tryRenderRoot(root); + tryRenderFromRoot(root); } } diff --git a/libs/horizon/src/renderer/TreeBuilder.ts b/libs/horizon/src/renderer/TreeBuilder.ts index 7d6201a2..0c7aacd8 100644 --- a/libs/horizon/src/renderer/TreeBuilder.ts +++ b/libs/horizon/src/renderer/TreeBuilder.ts @@ -251,7 +251,7 @@ function renderFromRoot(treeRoot) { } // 尝试去渲染,已有任务就跳出 -export function tryRenderRoot(treeRoot: VNode) { +export function tryRenderFromRoot(treeRoot: VNode) { if (treeRoot.shouldUpdate && treeRoot.task === null) { // 任务放进queue,但是调度开始还是异步的 treeRoot.task = pushRenderCallback( @@ -283,7 +283,7 @@ export function launchUpdateFromVNode(vNode: VNode) { // 不能改成下面的异步,否则会有时序问题,因为业务可能会依赖这个渲染的完成。 renderFromRoot(treeRoot); } else { - tryRenderRoot(treeRoot); + tryRenderFromRoot(treeRoot); if (!isExecuting()) { // 同步执行 @@ -313,12 +313,6 @@ function getChildByIndex(vNode: VNode, idx: number) { return node; } -export function setBuildResultError() { - if (getBuildResult() !== BuildCompleted) { - setBuildResult(BuildErrored); - } -} - // ============================== HorizonDOM使用 ============================== export function runDiscreteUpdates() { if (checkMode(ByAsync) || checkMode(InRender)) { diff --git a/libs/horizon/src/renderer/render/SuspenseComponent.ts b/libs/horizon/src/renderer/render/SuspenseComponent.ts index d0cb6f9e..47d117a8 100644 --- a/libs/horizon/src/renderer/render/SuspenseComponent.ts +++ b/libs/horizon/src/renderer/render/SuspenseComponent.ts @@ -9,7 +9,7 @@ import { Fragment, } from '../vnode/VNodeTags'; import {pushForceUpdate} from '../UpdateHandler'; -import {launchUpdateFromVNode, tryRenderRoot} from '../TreeBuilder'; +import {launchUpdateFromVNode, tryRenderFromRoot} from '../TreeBuilder'; import {updateShouldUpdateOfTree} from '../vnode/VNodeShouldUpdate'; import {getContextChangeCtx} from '../ContextSaver'; @@ -234,7 +234,7 @@ function resolvePromise(suspenseVNode: VNode, promise: PromiseType) { suspenseVNode.promiseResolve = true; const root = updateShouldUpdateOfTree(suspenseVNode); if (root !== null) { - tryRenderRoot(root); + tryRenderFromRoot(root); } } diff --git a/libs/horizon/src/renderer/submit/Submit.ts b/libs/horizon/src/renderer/submit/Submit.ts index e76f0b97..8bdf1266 100644 --- a/libs/horizon/src/renderer/submit/Submit.ts +++ b/libs/horizon/src/renderer/submit/Submit.ts @@ -11,7 +11,7 @@ import { callBeforeSubmitLifeCycles, submitDeletion, submitAddition, submitResetTextContent, submitUpdate, detachRef, } from './LifeCycleHandler'; -import {tryRenderRoot, setProcessing} from '../TreeBuilder'; +import {tryRenderFromRoot, setProcessing} from '../TreeBuilder'; import { BySync, InRender, @@ -78,7 +78,7 @@ export function submitToRender(treeRoot) { countLoopingUpdate(treeRoot); // 在退出`submit` 之前始终调用此函数,以确保任何已计划在此根上执行的update被执行。 - tryRenderRoot(treeRoot); + tryRenderFromRoot(treeRoot); if (rootThrowError) { const error = rootThrowError; diff --git a/libs/horizon/src/renderer/taskExecutor/RenderQueue.ts b/libs/horizon/src/renderer/taskExecutor/RenderQueue.ts index 0db72fcb..9950b369 100644 --- a/libs/horizon/src/renderer/taskExecutor/RenderQueue.ts +++ b/libs/horizon/src/renderer/taskExecutor/RenderQueue.ts @@ -42,22 +42,14 @@ function callRenderQueue() { // 防止重入 isCallingRenderQueue = true; - let i = 0; try { - for (; i < renderQueue.length; i++) { - let callback = renderQueue[i]; + let callback; + while (callback = renderQueue.shift()) { callback(); } + renderQueue = null; } catch (error) { - // 如果有异常抛出,请将剩余的回调留在队列中 - if (renderQueue !== null) { - renderQueue = renderQueue.slice(i + 1); - } - - // 在下一个异步中再调用 - runAsync(callRenderQueueImmediate, ImmediatePriority); - throw error; } finally { isCallingRenderQueue = false;