【问题标题】:Redux and Redux thunk not synchronousRedux 和 Redux thunk 不同步
【发布时间】:2018-11-10 17:54:57
【问题描述】:

我使用 redux 的假设是调度动作是一个同步任务。

fire action 1 - > store updated
fire action 2 -> store updated

在我目前正在进行的一个项目中,我有一个产品定制器,它允许一些用户选择,他们可以下多个订单,但如果他们只是订购他们当前的选择并选择“购买”,我会触发“ addOrder”,将他们的选择添加到 orders 数组,然后是“purchase”操作,这是一个将存储在 redux 中的订单提交到我的购物车 API 的 thunk。

我希望我能够依赖商店处于一致状态,在每个操作之后可靠,因此当第二个操作触发时,它会在第一个常规操作之后具有状态在它之前发射,但没有骰子。

  • 我在这里对 redux 的期望和理解是否不正确?
  • 如果是这样,redux thunk 是否以某种方式在正常调度之外起作用?

在我连接的组件中,我调度每个动作:

//.... inside component
purchase = () => {
  this.props.addOrder(); // regular action
  this.props.purchase(); // thunk
};
// ... rest of component

【问题讨论】:

  • 你能提供一个 repo 或 codesandbox.io 例子吗?听起来肯定是堆栈中的一个额外中间件正在为您的商店注入一些异步性。
  • 我也遇到了同样的问题,你知道为什么会这样吗?

标签: reactjs redux react-redux redux-thunk


【解决方案1】:

是的,调度总是 100% 同步,除非被中间件更改。是的,默认情况下,您可以在调度后再次调用getState() 以获取更新的状态:

function checkStateAfterDispatch() {
    return (dispatch, getState) => {
        const firstState = getState();
        dispatch({type : "FIRST_ACTION"});

        const secondState = getState();

        if(secondState.someField != firstState.someField) {
            dispatch({type : "SECOND_ACTION"});
        }    
    }
}

【讨论】:

  • 除了在我的组件中调度一个常规动作,然后是一个 thunk 时,thunk 中的 getState 几乎总是(竞争条件)在第一个动作完成之前检索状态。你所解释的是我理解和预期的,但不是我观察到的。
  • Redux 核心中没有竞态条件,期间。如果您获得“优先”状态,那是因为您添加到应用程序中的一些中间件正在延迟调度的操作到达减速器并使其异步。
  • 我唯一拥有的是`composeEnhancers(applyMiddleware(thunk))`
  • 您只需要在 thunk 文件中读取 getState() .. 这将具有正确的状态
猜你喜欢
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2016-09-22
  • 2017-10-23
  • 2018-01-31
相关资源
最近更新 更多