Redux是否会出现脏读问题?

作者站长头像
站长
· 阅读数 11

问题描述

目前本人尝试在公司的客户端项目中引入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个回答
avatar
test
2024-07-01

你说的脏读问题,一般是在数据库里,这只是一个状态管理库没有事务不存在并发状态更新,这里每一个 action 的处理都是同步的,状态的更新是按照 action 发起的顺序依次进行的。你的上面的例子即使第二个请求在第一个请求的 action 处理过程中完成,它发起的 action 也会等待第一个请求的 action 处理完成后再进行处理。Redux 的设计是有大厂在用的不可能你这个问题都看不到,你想要处理更复杂的异步逻辑,你可以用 Redux 的中间件, redux-thunk 或者redux-saga。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容