为了账号安全,请及时绑定邮箱和手机立即绑定

关于React源码中一些全局变量用意有些疑问,贴了关于 isRendering 全局变量的代码,有没有帮忙解答一下的?

/ 猿问

关于React源码中一些全局变量用意有些疑问,贴了关于 isRendering 全局变量的代码,有没有帮忙解答一下的?

一身三影 2019-07-03 15:37:04

如题,比如 ReactFilberScheduler.js  中有一个全局变量 isRendering 变量在 requestWork  和 performWorkOnRoot 方法中有用到,

requestWork 函数开头判断当 isRendering = true 的直接返回return;而在 performWorkOnRoot 的开头将 isRendering 置为 true  而在末尾置为 false,那么问题来了  requestWork  的开头对 isRendering 的判断有什么意义?

function requestWork(root: FiberRoot, expirationTime: ExpirationTime) {

  addRootToSchedule(root, expirationTime);

  if (isRendering) {

    // Prevent reentrancy. Remaining work will be scheduled at the end of

    // the currently rendering batch.

    return;

  }

  //....Omitted code

}

function performWorkOnRoot(root: FiberRoot, expirationTime: ExpirationTime, isExpired: boolean) {

  invariant(

    !isRendering,

    'performWorkOnRoot was called recursively. This error is likely caused ' +

      'by a bug in React. Please file an issue.',

  );


  isRendering = true;

  //...Omitted code


  isRendering = false;

}


查看完整描述

1 回答

?
pardon110

很显然只是个标志位,控制代码执行流程,在一些异步执行需要同步代码的情况下用到。你需要知道,代码并不总是从上到下逐行执行,而异步执行在js中是常态

查看完整回答
反对 回复 2019-07-03
  • 一身三影
    一身三影
    这些方法不是在同一个线程执行么,同一个线程加这种标志位并没有什么实际的用处吧
  • 一身三影
    一身三影
    requestWork 和 performWorkOnRoot 在同一个线程执行,那么requestWork中 isRendering 永远不会为 true

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信