关于setState的执行顺序



  • 最近在看js事件轮询相关的知识,因此想看看setState的执行顺序到底是怎么样的,因此写了这样一段代码

    constructor(props){
            super(props);
            this.state={
                a:'a',
                b:'b'
            };
        }
    
        componentDidMount() {
            this.test()
        }
    
        test=()=>{
          async function a() {
            console.log('async')
            await a2()
            console.log('Async done')
          }
          async function a2(){
            console.log('a2')
          }
          
            console.log('start')
    
            new Promise((resolve,reject)=>{
                console.log('Promise')
                resolve()
            }).then(()=>{
                console.log('Promise done')
            })
    
            this.setState({b:'B'},()=>console.log(this.state.b))
    
            console.log('?')
    
            a()
    
            process.nextTick(()=>{
              console.log('process')    
          })
            setTimeout(() => {
                console.log('timeout')
            }, 0);
    
            this.setState({a:'A'},()=>console.log(this.state.a))
    
            
            
        }
    

    发现在Chrom中的输出结果为:

    start
    Promise
    ?
    async
    a2
    B
    A
    Promise done
    Async done
    process
    timeout
    

    得出结论:它会合并所有的setState,且在本轮宏任务执行完后,在微任务执行开始之前执行

    请问这个结论对吗?(node版本:10.14.1)