Match-id-3bcc96a2843226df089b690d0e7124a482764648

This commit is contained in:
* 2022-01-26 18:13:20 +08:00 committed by *
commit a31d2f6fc4
5 changed files with 12 additions and 19 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';
function consoleError(error: any): void { function consoleError(error: any): void {
if (isDev) { if (isDev) {
@ -82,7 +83,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;

View File

@ -272,7 +272,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(
@ -304,7 +304,7 @@ export function launchUpdateFromVNode(vNode: VNode) {
// 不能改成下面的异步,否则会有时序问题,因为业务可能会依赖这个渲染的完成。 // 不能改成下面的异步,否则会有时序问题,因为业务可能会依赖这个渲染的完成。
renderFromRoot(treeRoot); renderFromRoot(treeRoot);
} else { } else {
tryRenderRoot(treeRoot); tryRenderFromRoot(treeRoot);
if (!isExecuting()) { if (!isExecuting()) {
// 同步执行 // 同步执行

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';
@ -210,7 +210,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, submitClear, submitResetTextContent, submitUpdate, detachRef, submitClear,
} 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

@ -28,22 +28,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;