scheduleWork

266 阅读1分钟
function scheduleWork(fiber, expirationTime) {
      // 找到root,设置更新节点的所有父节点的expirationTime为当前的expirationTime,除非父节点的expirationTime
      // 大于当期的expirationTime,设置父节点的childExpirationTime,除非父节点的childExpirationTime大于当前的
      // expirationTime,然后返回Fiber root节点
      var root = scheduleWorkToRoot(fiber, expirationTime);
      // root 为空报错
      if (root === null) {
        {
          switch (fiber.tag) {
            case ClassComponent:
              warnAboutUpdateOnUnmounted(fiber, true);
              break;
            case FunctionComponent:
            case ForwardRef:
            case MemoComponent:
            case SimpleMemoComponent:
              warnAboutUpdateOnUnmounted(fiber, false);
              break;
          }
        }
        return;
      }
      // 现在没有工作,不分render和commit,且有优先级比较低的任务在等待执行,如果当前的expirationTime
      // 更大,说明优先级更高,则打断当前节点,执行优先级更高的任务
      if (
        !isWorking &&
        nextRenderExpirationTime !== NoWork &&
        expirationTime > nextRenderExpirationTime
      ) {
        // This is an interruption. (Used for performance tracking.)
        interruptedBy = fiber;
        resetStack();
      }
      // 更新root的过期时间
      markPendingPriorityLevel(root, expirationTime);
      if (
        // If we're in the render phase, we don't need to schedule this root
        // for an update, because we'll do it before we exit...
        !isWorking ||
        isCommitting$1 ||
        // ...unless this is a different root than the one we're rendering.
        nextRoot !== root
      ) {
        var rootExpirationTime = root.expirationTime;
        requestWork(root, rootExpirationTime);
      }
      if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
        // subsequent 后来的
        // Reset this back to zero so subsequent updates don't throw.
        nestedUpdateCount = 0;
        invariant(
          false,
          "Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops."
        );
      }
    }