Redux的reducer为什么不能有异步操作

回顾Redux设计和使用的三大基本原则

可参考笔记Redux入门(2)

  1. 单一数据源,也就是store中的state是唯一的
  2. state 是只读,Redux并没有暴露出直接修改state的接口,必须通过action来触发修改(即:只有store能改变自己的state)
  3. reducer必须是纯函数

Redux的设计初衷

先从Redux的设计层面来解释为什么Reducer必须是纯函数。

Redux的设计参考了Flux的模式,作者希望以此来实现时间旅行,保存应用的历史状态,实现应用状态的可预测。所以整个Redux都是函数式编程的范式,要求reducer是纯函数也是自然而然的事情,使用纯函数才能保证相同的输入得到相同的输入,保证状态的可预测

不是纯函数的例子可以参考Redux入门(2)中的例子


Redux的源码

那么reducer到底干了件什么事,在Redux的源码中只用了一行来表示:

1
currentState = currentReducer(currentState, action)

这一行简单粗暴的在代码层面解释了为什么currentReducer必须是纯函数。currentReducer就是我们的reducer(至于为什么会加个current有兴趣的可以自己去看源码),reducer通过store传入的state和action进行处理后需要返回的是一个新的state,store拿到这个新的state后就会修改自身的state。
reducer是用来计算state的,所以它的返回值必须是state,也就是我们整个应用的状态,而不能是promise之类的

要在reducer中加入异步的操作,如果你只是单纯想执行异步操作,不会等待异步的返回,那么在reducer中执行的意义是什么。如果想把异步操作的结果反应在state中,首先整个应用的状态将变的不可预测,违背Redux的设计原则,其次,此时的currentState将会是promise之类而不是我们想要的应用状态(state),根本是行不通的。

其实这个问题应该是Redux中为什么不能有副作用的操作更合适。


,