diff --git a/libs/horizon/src/renderer/ErrorHandler.ts b/libs/horizon/src/renderer/ErrorHandler.ts index c6946c69..db190048 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'; function consoleError(error: any): void { if (isDev) { @@ -82,7 +83,7 @@ export function handleRenderThrowError( } // 抛出错误无法作为suspense内容处理(或无suspense来处理),这次当成真的错误来处理 - setBuildResultError(); + setBuildResult(BuildErrored); // 向上遍历寻找ClassComponent组件(同时也是Error Boundaries组件) 或者 TreeRoot let vNode = sourceVNode.parent; diff --git a/libs/horizon/src/renderer/TreeBuilder.ts b/libs/horizon/src/renderer/TreeBuilder.ts index 35caaba6..ff7dd150 100644 --- a/libs/horizon/src/renderer/TreeBuilder.ts +++ b/libs/horizon/src/renderer/TreeBuilder.ts @@ -272,7 +272,7 @@ function renderFromRoot(treeRoot) { } // 尝试去渲染,已有任务就跳出 -export function tryRenderRoot(treeRoot: VNode) { +export function tryRenderFromRoot(treeRoot: VNode) { if (treeRoot.shouldUpdate && treeRoot.task === null) { // 任务放进queue,但是调度开始还是异步的 treeRoot.task = pushRenderCallback( @@ -304,7 +304,7 @@ export function launchUpdateFromVNode(vNode: VNode) { // 不能改成下面的异步,否则会有时序问题,因为业务可能会依赖这个渲染的完成。 renderFromRoot(treeRoot); } else { - tryRenderRoot(treeRoot); + tryRenderFromRoot(treeRoot); if (!isExecuting()) { // 同步执行 diff --git a/libs/horizon/src/renderer/render/SuspenseComponent.ts b/libs/horizon/src/renderer/render/SuspenseComponent.ts index b84b1582..b601a551 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'; @@ -210,7 +210,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 446569bb..b7eaa86c 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, submitClear, } 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 31760489..de3203d8 100644 --- a/libs/horizon/src/renderer/taskExecutor/RenderQueue.ts +++ b/libs/horizon/src/renderer/taskExecutor/RenderQueue.ts @@ -28,22 +28,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;