Match-id-c9a7495e252e4e9c279e1a95f9d466f6985902e5

This commit is contained in:
* 2022-01-26 17:43:53 +08:00 committed by *
parent 478a44b60e
commit 21b1aa3a56
5 changed files with 13 additions and 26 deletions

View File

@ -8,10 +8,11 @@ import type {Update} from './UpdateHandler';
import {ClassComponent, TreeRoot} from './vnode/VNodeTags'; import {ClassComponent, TreeRoot} from './vnode/VNodeTags';
import {FlagUtils, Interrupted} from './vnode/VNodeFlags'; import {FlagUtils, Interrupted} from './vnode/VNodeFlags';
import {newUpdate, UpdateState, pushUpdate} from './UpdateHandler'; import {newUpdate, UpdateState, pushUpdate} from './UpdateHandler';
import {launchUpdateFromVNode, setBuildResultError, tryRenderRoot} from './TreeBuilder'; import {launchUpdateFromVNode, tryRenderFromRoot} from './TreeBuilder';
import {setRootThrowError} from './submit/Submit'; import {setRootThrowError} from './submit/Submit';
import {handleSuspenseChildThrowError} from './render/SuspenseComponent'; import {handleSuspenseChildThrowError} from './render/SuspenseComponent';
import {updateShouldUpdateOfTree} from './vnode/VNodeShouldUpdate'; import {updateShouldUpdateOfTree} from './vnode/VNodeShouldUpdate';
import {BuildErrored, setBuildResult} from './GlobalVar';
// 处理capture和bubble阶段抛出的错误 // 处理capture和bubble阶段抛出的错误
export function handleRenderThrowError( export function handleRenderThrowError(
@ -33,7 +34,7 @@ export function handleRenderThrowError(
} }
// 抛出错误无法作为suspense内容处理或无suspense来处理这次当成真的错误来处理 // 抛出错误无法作为suspense内容处理或无suspense来处理这次当成真的错误来处理
setBuildResultError(); setBuildResult(BuildErrored);
// 向上遍历寻找ClassComponent组件同时也是Error Boundaries组件 或者 TreeRoot // 向上遍历寻找ClassComponent组件同时也是Error Boundaries组件 或者 TreeRoot
let vNode = sourceVNode.parent; let vNode = sourceVNode.parent;
@ -167,7 +168,7 @@ function triggerUpdate(vNode, state) {
const root = updateShouldUpdateOfTree(vNode); const root = updateShouldUpdateOfTree(vNode);
if (root !== null) { if (root !== null) {
tryRenderRoot(root); tryRenderFromRoot(root);
} }
} }

View File

@ -251,7 +251,7 @@ function renderFromRoot(treeRoot) {
} }
// 尝试去渲染,已有任务就跳出 // 尝试去渲染,已有任务就跳出
export function tryRenderRoot(treeRoot: VNode) { export function tryRenderFromRoot(treeRoot: VNode) {
if (treeRoot.shouldUpdate && treeRoot.task === null) { if (treeRoot.shouldUpdate && treeRoot.task === null) {
// 任务放进queue但是调度开始还是异步的 // 任务放进queue但是调度开始还是异步的
treeRoot.task = pushRenderCallback( treeRoot.task = pushRenderCallback(
@ -283,7 +283,7 @@ export function launchUpdateFromVNode(vNode: VNode) {
// 不能改成下面的异步,否则会有时序问题,因为业务可能会依赖这个渲染的完成。 // 不能改成下面的异步,否则会有时序问题,因为业务可能会依赖这个渲染的完成。
renderFromRoot(treeRoot); renderFromRoot(treeRoot);
} else { } else {
tryRenderRoot(treeRoot); tryRenderFromRoot(treeRoot);
if (!isExecuting()) { if (!isExecuting()) {
// 同步执行 // 同步执行
@ -313,12 +313,6 @@ function getChildByIndex(vNode: VNode, idx: number) {
return node; return node;
} }
export function setBuildResultError() {
if (getBuildResult() !== BuildCompleted) {
setBuildResult(BuildErrored);
}
}
// ============================== HorizonDOM使用 ============================== // ============================== HorizonDOM使用 ==============================
export function runDiscreteUpdates() { export function runDiscreteUpdates() {
if (checkMode(ByAsync) || checkMode(InRender)) { if (checkMode(ByAsync) || checkMode(InRender)) {

View File

@ -9,7 +9,7 @@ import {
Fragment, Fragment,
} from '../vnode/VNodeTags'; } from '../vnode/VNodeTags';
import {pushForceUpdate} from '../UpdateHandler'; import {pushForceUpdate} from '../UpdateHandler';
import {launchUpdateFromVNode, tryRenderRoot} from '../TreeBuilder'; import {launchUpdateFromVNode, tryRenderFromRoot} from '../TreeBuilder';
import {updateShouldUpdateOfTree} from '../vnode/VNodeShouldUpdate'; import {updateShouldUpdateOfTree} from '../vnode/VNodeShouldUpdate';
import {getContextChangeCtx} from '../ContextSaver'; import {getContextChangeCtx} from '../ContextSaver';
@ -234,7 +234,7 @@ function resolvePromise(suspenseVNode: VNode, promise: PromiseType<any>) {
suspenseVNode.promiseResolve = true; suspenseVNode.promiseResolve = true;
const root = updateShouldUpdateOfTree(suspenseVNode); const root = updateShouldUpdateOfTree(suspenseVNode);
if (root !== null) { if (root !== null) {
tryRenderRoot(root); tryRenderFromRoot(root);
} }
} }

View File

@ -11,7 +11,7 @@ import {
callBeforeSubmitLifeCycles, submitDeletion, submitAddition, callBeforeSubmitLifeCycles, submitDeletion, submitAddition,
submitResetTextContent, submitUpdate, detachRef, submitResetTextContent, submitUpdate, detachRef,
} from './LifeCycleHandler'; } from './LifeCycleHandler';
import {tryRenderRoot, setProcessing} from '../TreeBuilder'; import {tryRenderFromRoot, setProcessing} from '../TreeBuilder';
import { import {
BySync, BySync,
InRender, InRender,
@ -78,7 +78,7 @@ export function submitToRender(treeRoot) {
countLoopingUpdate(treeRoot); countLoopingUpdate(treeRoot);
// 在退出`submit` 之前始终调用此函数以确保任何已计划在此根上执行的update被执行。 // 在退出`submit` 之前始终调用此函数以确保任何已计划在此根上执行的update被执行。
tryRenderRoot(treeRoot); tryRenderFromRoot(treeRoot);
if (rootThrowError) { if (rootThrowError) {
const error = rootThrowError; const error = rootThrowError;

View File

@ -42,22 +42,14 @@ function callRenderQueue() {
// 防止重入 // 防止重入
isCallingRenderQueue = true; isCallingRenderQueue = true;
let i = 0;
try { try {
for (; i < renderQueue.length; i++) { let callback;
let callback = renderQueue[i]; while (callback = renderQueue.shift()) {
callback(); callback();
} }
renderQueue = null; renderQueue = null;
} catch (error) { } catch (error) {
// 如果有异常抛出,请将剩余的回调留在队列中
if (renderQueue !== null) {
renderQueue = renderQueue.slice(i + 1);
}
// 在下一个异步中再调用
runAsync(callRenderQueueImmediate, ImmediatePriority);
throw error; throw error;
} finally { } finally {
isCallingRenderQueue = false; isCallingRenderQueue = false;