expirationTime的问题

来源:4-5 reactScheduler(1)

MeSKiL

2020-04-15

老师我遇到了一个很迷惑的问题。
不知道您有没有关注react最新的源码,react最新的源码里关于expirationTime的计算方式改变了。最新的expirationTime是越大,优先级就越高。

const MAX_SIGNED_31_BIT_INT = 1073741823;

export const Sync = MAX_SIGNED_31_BIT_INT;

从它定义Sync的值就可以看出,同步任务的expirationTime是最大的,优先级就是最高的。
时间越早,expirationTime就越大,优先级就越高。

但是在调度的时候有个task的概念。

function unstable_scheduleCallback(priorityLevel, callback, options) {
// 删了无关部分
  var currentTime = getCurrentTime();

  var startTime;
  var timeout;
  if (typeof options === 'object' && options !== null) {
    timeout =
      typeof options.timeout === 'number'
        ? options.timeout
        : timeoutForPriorityLevel(priorityLevel);
  } else {
    timeout = timeoutForPriorityLevel(priorityLevel);
    startTime = currentTime;
  }

  var expirationTime = startTime + timeout;

  var newTask = {
    id: taskIdCounter++,
    callback,
    priorityLevel,
    startTime,
    expirationTime,
    sortIndex: -1,
  };

	//xxx
}

从这里可以看出task的expirationTime是startTime+timeout。那就是当前时间加上timeout,所以task.expirationTime是时间越早,task.expirationTime越小。

您讲课那版本的话,他们是一样的。
但是由于新版本expirationTime是越大,优先级越高,所以fiber和task的expirationTime的优先级的逻辑是反着来的。。。

写回答

1回答

Jokcy

2020-04-16

是这样的,因为以前是越大优先级越高,但是有个例外就是同步任务是0,这有点奇怪,所以后来改成按大小来排序了

0
2
qq_慕田峪3144384
以前的不是越小越高吗
2022-02-10
共2条回复

React源码深度解析 高级前端工程师必备技能

掌握React源码,让你的开发水平没有上限,更不惧前端未来的到来

1749 学习 · 336 问题

查看课程