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

关于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;}
查看完整描述

3 回答

?
pardon110

TA贡献1038条经验 获得超227个赞

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

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

添加回答

举报

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