Q: setState()是同步的还是异步的?
同步:比如 js 就是同步的,一个同步执行的函数是直到该函数所要做的事情全都做完了才会返回(理解:干完这个再干下一个)
异步:当异步函数被调用时,该函数立即返回(即便该函数规定的操作任务还未完成)(理解:干到一半的项目可不能交付,上个版本你先用着)
比如 js 就是单线程的,第一个函数若还未完成规定操作,则该线程就会被挂起,直至该函数完成规定操作,才能使该线程被重新调度。 在使用 setState()方法的时候发现其能表现出”异步“的特点,经查阅资料总结如下:
setState方法的执行过程是同步的,但函数内存在一个叫 isBatchingUpdates 的变量判断当前是否要直接更新 this.state 还是放到队列中稍后更新。 这个布尔变量的值(默认 false)是由 batchedUpdate 函数在生命周期函数之前被调用后得到的。
个人理解:setState()默认情况下调用 batchedUpdate 函数,将 isBatchingUpdates 变量的值设置为 true,从而实现”异步“,减少了性能消耗。 不过如果我们在执行时想拿到函数同步应该拿到的结果的话需要借助于 setState() 方法内的 callback,在 callback 内获取到的结果则就是函数同步处理时的操作结果。