setState是同步还是异步?

1,211 阅读1分钟

问题:

背景

当getUserIng === true时,页面渲染;

预期结果:window.test('id', 'res.user') => setState

结果:setState => window.test('id', 'res.user')

即:某组件中调用test.id时,test.id为空,若setState是异步的,不应该出现此状态~

推断1

  1. setState可能是极快的异步,
    结果:
    貌似是应验了~~
  2. 验证:如果setState time 是同步的,那么

应该是:state => outside,结果:

由此可是上述推断是错误的,应该是promise的问题;

推断2

  1. promise的问题 下面再来一题:猜想结果

结果:

2. setTimeout中: count默认为0

结果:count 为5

那么,setState是同步的吗?是批量render的吗?确切是为什么呢?

原因

推荐一篇文章, Batch Update

react 中实现batch update

react中对于非自身事件(microTask、macroTask), batch update将无法生效,故setTimeOut中,setState N次;react 通过Transaction实现batchUpdate,不依赖语言特性的通用模式

vue 中

推荐文章:Vue异步更新队列原理从入门到放弃

放一张个人理解图,如果错误,望指出

拓展:

问题1:(tick代表微任务)

  1. this.a = 1;
  2. tick(this.b = 2)
  3. tick(this.c = 3) 问:render几次?

问题2:

  1. tick(this.aa = 1)
  2. tick(this.bb = 2) 问: render几次?

答案分别是:2, 1

【推荐文章】

Change Detection And Batch Update