Redux是否会出现脏读问题?
问题描述
目前本人尝试在公司的客户端项目中引入react-redux,但是设计时发现如果一个状态可以被多个actions更改,可能会出现脏读问题。
相关代码
简单示例代码:
function counterReducer(state = { value: 0 }, action) {
switch (action.type) {
case 'incremented':
return { value: state.value + 1 }
case 'decremented':
return { value: state.value - 1 }
default:
return state
}
}
执行dispatch:
urlsArr.foreach(url => {
axios.post(url).then(response => {
store.dispatch({ type: ''incremented''})
});
});
当第一个post请求回来后,redux执行dispatch,并且在源码中显示会在这个过程中执行store.getState(), 随后把当前state和actions改动的state进行merge并更新到store的state中。
但是如果在第一个请求执行merge并更改store的state的过程中,第二个请求也来了并也执行了store.getState,那么就得到的就是第一次还没有改过的state,我设计的这个计数器出现了脏读问题。
分析
根据我的个人经验,js作为单线程本身是以同步代码段来作为调度的单位,理论上不会出现脏读问题,客户端本身也很难出现这种并发的问题。
我个人使用本地代码简单跑了下,暂时未发现会出现这个问题。
但是因为是商业软件的代码,设计需要谨慎一些,希望各位大佬帮我分析下,redux是否有可能会出现我上面描述的脏读问题,如果有什么证据能证明redux设计了机制不会出现该问题?
回复
1个回答
test
2024-07-01
你说的脏读问题,一般是在数据库里,这只是一个状态管理库没有事务不存在并发状态更新,这里每一个 action 的处理都是同步的,状态的更新是按照 action 发起的顺序依次进行的。你的上面的例子即使第二个请求在第一个请求的 action 处理过程中完成,它发起的 action 也会等待第一个请求的 action 处理完成后再进行处理。Redux 的设计是有大厂在用的不可能你这个问题都看不到,你想要处理更复杂的异步逻辑,你可以用 Redux 的中间件, redux-thunk 或者redux-saga。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容