当前位置: 首页 > 知识库问答 >
问题:

react-native - Redux是否会出现脏读问题?

朱海超
2023-07-07

问题描述

目前本人尝试在公司的客户端项目中引入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个答案

王宏扬
2023-07-07

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

 类似资料:
  • DEPRECATED. This project is not maintained anymore. Starter For Firebase, React Native, Redux Applications With 100% Of Code In Common Between IOS And Android, with built In Authentication, Crud Examp

  • Demo This project was bootstrapped with Create React Native App. Below you'll find information about performing common tasks. The most recent version of this guide is available here. Table of Contents

  • 我正在尝试将redux实现到一个相对简单的应用程序中,但是我的操作似乎没有正确地触发reducer。通过控制台日志记录,操作似乎正在启动,但相应的reducer没有被执行。 app.js: reducers/index.js: riskreducer.js js(RootStack中使用redux的子组件): 编辑:我已经将reducer中的初始值更改为一个适当的对象,但是在调用该操作之后,我的r

  • 当我尝试在终端中执行命令React-本机run-android时,我在VScode中遇到了这个奇怪的错误。 还运行了react native doctor和Node、yarn、android_home和android sdk 0错误的所有绿色复选标记 不确定如何解决这些问题,因为我已经在以前的线程中尝试了所有建议。有人有这个问题可以提供帮助吗?这是一台窗户机器。 错误图像

  • 失败:生成失败,出现异常。 > 其中:构建文件'/users/blickx/desktop/dumont-reactnative/dumont/node_modules/@react-native-community/async-storage/android/Build.gradle'行:36 错误:评估项目':@react-native-community_async-storage'时出现问

  • > 出了什么问题:配置项目“:反应原生矢量图标”时出现问题。 无法解析配置“:反应本机矢量图标:类路径”的所有文件。找不到 com.android.tools.build:gradle:2.3 的任何匹配项。 因为没有可用的com.android.tools.build:gradle版本。在以下位置搜索: https://jcenter.bintray.com/com/android/tools/