Match-id-3bcc96a2843226df089b690d0e7124a482764648
This commit is contained in:
commit
a31d2f6fc4
|
@ -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;
|
||||
|
|
|
@ -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()) {
|
||||
// 同步执行
|
||||
|
|
|
@ -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<any>) {
|
|||
suspenseVNode.promiseResolve = true;
|
||||
const root = updateShouldUpdateOfTree(suspenseVNode);
|
||||
if (root !== null) {
|
||||
tryRenderRoot(root);
|
||||
tryRenderFromRoot(root);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue