Dispatch 一个简单 action 是否是异步?

#1

dispatch 一个简单的 action ,仅仅只是通过reducer 去修改当前的 state 值。这样的操作是否是同步的?

比如:

function reducer(state = initialState, action) {
  switch (action.type) {

    case actionA:
      return state => {
       ... state,
       a: 1,
     }
    case actionB:
      return state =>{
       ... state,
       b: 1,
     }
    default:
      return state;
  }
}


// 比较粗糙的代码,但实际意义就是,dispatch actionA 我仅仅是修改state 中的a 值,而再没有其他的异步操作
dispatch(actionA);

// 同 actionA
dispatch(actionB);

想问这样简单的两个 action 触发是否是同步执行的,也就是先更新 a 值再更新 b 值?

从redux 源码中看, dispatch函数做的工作无非是自动执行一遍reducer函数,无论之前是异步还是同步, action 走到reducer里,都只是经过一个 “工厂”,重新加工 state 而已,所以我理解


dispatch(actionA);

// 这里能够直接拿到已经更新的 a 值 ?

state.a 

想问上面这里,这里能够直接拿到已经更新的 a 值 ? 想确定一下这样的说法对不对?

#2

不要完全相信什么网络大咖、大神的话,相信自己的代码,自己提问自己验证,是最好的学习方式,应该没有之一了…
哦,对了!你提的这个问题的答案是 ‘是的,可以拿到更新后的a值!’

#3

你可以这样:

store.getState().a  // 1

dispatch(actionA); // 假设action更新a值 + 1

store.getState().a // 返回最新的state 2

但是不能这样:

this.props.a // 1

dispatch(actionA);

this.props.a // 2? 不一定

原因很简单,当你 dispatch 一个 action 的时候,会跑一遍注册在 createStore 中所有的reducer,然后返回最新的store,这边确实是同步,但是经过 connect 的组件如果去访问 this.props 的话是无法保证同步的,因为 connect 中调用的还是 setState,关于 setState 的同步异步问题你可以看下我的这篇文章

#4

有理有据,感谢

#5

嗯,非常感谢

#6

不客气,有帮助的话文章点个赞就行了,哈哈哈哈