getState 总是 return 调度调用后的最新状态吗?
Will getState always return the latest state after a dispatch call?
如果我有这样的代码,
dispatch({
type: actionTypes.ABCD,
...newInfo,
});
const state = getState();
我可以 100% 相信 state
是最新状态吗?或者 dispatch
是异步的,我无法保证状态是否已更新?
是的。对 dispatch()
的调用本身是 100% 同步的。到 dispatch()
returns 时,root reducer 已经 运行,状态值已经更新,所有订阅者都已收到通知。所以是的,在 dispatch()
之后立即调用 getState()
将 return 最新值。
需要注意的是,任何中间件都可以拦截、延迟或修改已分派的操作。所以,最终的答案取决于你安装了什么中间件以及它们是如何配置的。
getState() 确实会检索最新值,但是如果您没有改变状态(您不应该改变状态,例如使用 Immer 库),则将其设置为 'state' 动作创建器中的变量。
例如:
let state = getState();
dispatch({
type: actionTypes.someStateChange,
newInfo1: newInfo
});
dispatch({
type: actionTypes.someOtherAction,
infoDependentOnNewInfo1: state.newInfo1.property
});
这不会像预期的那样运行,因为上面定义的状态将具有旧状态,因为第一次分派创建了一个新的不可变状态,该状态未被 'state' 变量引用。
如果我有这样的代码,
dispatch({
type: actionTypes.ABCD,
...newInfo,
});
const state = getState();
我可以 100% 相信 state
是最新状态吗?或者 dispatch
是异步的,我无法保证状态是否已更新?
是的。对 dispatch()
的调用本身是 100% 同步的。到 dispatch()
returns 时,root reducer 已经 运行,状态值已经更新,所有订阅者都已收到通知。所以是的,在 dispatch()
之后立即调用 getState()
将 return 最新值。
需要注意的是,任何中间件都可以拦截、延迟或修改已分派的操作。所以,最终的答案取决于你安装了什么中间件以及它们是如何配置的。
getState() 确实会检索最新值,但是如果您没有改变状态(您不应该改变状态,例如使用 Immer 库),则将其设置为 'state' 动作创建器中的变量。
例如:
let state = getState();
dispatch({
type: actionTypes.someStateChange,
newInfo1: newInfo
});
dispatch({
type: actionTypes.someOtherAction,
infoDependentOnNewInfo1: state.newInfo1.property
});
这不会像预期的那样运行,因为上面定义的状态将具有旧状态,因为第一次分派创建了一个新的不可变状态,该状态未被 'state' 变量引用。