Redux 中间件未调度新操作

Posted

技术标签:

【中文标题】Redux 中间件未调度新操作【英文标题】:Redux middleware not dispatching new actions 【发布时间】:2018-06-12 07:23:01 【问题描述】:

我正在创建一个监听特定操作的 Redux 中间件。如果该操作类型与我要查找的内容匹配,我想发送另一个操作。这样做的原因是因为我有一些共享功能的不同组件,所以我想更新操作以具有相似的类型,但不同的有效负载(术语),如下所示:

const updateActions = store => next => action => 
    console.log(action);
    if (action.type === 'UNIQUE_ACTION_A') 
        return next( type: 'NEW_ACTION', term: 'new_action_a_test' );
     else if (action.type === 'UNIQUE_ACTION_B') 
        return next(
            type: 'NEW_ACTION',
            term: 'new_action_b_test'
        );
    
    return next(action);
;

const store = createStore(
    rootReducer,
    composeWithDevTools(applyMiddleware(thunk, updateActions))
);

我遇到的问题是这些操作没有调度。当我 console.log 所有动作时,它们会继续正常运行,而不是调度新动作。就好像调度这些动作的调用被忽略了。我在这里做错了什么?谢谢!

【问题讨论】:

你有没有看到顶部的console.log @Krasimir 是的。它记录了每一个动作,所以我看到它忽略了我想要调度的动作。 我认为您不会看到NEW_ACTION 注销,因为这不是通过相同的功能。它被发送到减速器。您可以尝试将 console.log 放在您的减速器中,看看您是否得到 NEW_ACTION 而不是 UNIQUE_ACTION_A 例如。 【参考方案1】:

中间件内部的nextdispatch 之间存在差异。 dispatch 向调度链的最开始发送一个动作,这将导致它运行通过管道中的所有中间件。 next 在这个中间件之后将其发送到 next 中间件,并最终发送到 reducer。通过调用next(type : "NEW_ACTION"),您将其发送到下一个中​​间件,而这个中间件永远不会看到"NEW_ACTION"

另见the Redux FAQ entry on next vs dispatch in middleware。

【讨论】:

谢谢。我更新为使用store.dispatch( type: 'NEW_ACTION', term: 'new_action_a_test' ),而不是next,但我收到Uncaught RangeError: Maximum call stack size exceeded 错误,因为它会产生无限循环。有没有办法在不陷入无限循环的情况下使用dispatch 您的逻辑一定有问题,以至于您总是调度这个新动作,而不是仅仅有条件地调度。您需要修复您的逻辑,使其仅在特定条件下调度新操作,并且这些条件不会重复。 是的!你是对的。我的工作代码库的逻辑存在问题(不在上面的示例中)。我正在检查并将操作类型设置为相同,这会导致循环。基于上面的这个例子,它不会进入循环,因为它在匹配一次后将类型设置为不同。谢谢马克!

以上是关于Redux 中间件未调度新操作的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Redux 中间件 - 调度到中间件链的开头?

Redux thunk - 错误 · 动作必须是普通对象。使用自定义中间件进行异步操作,即使调度具有键类型的对象

在 redux 中在哪里调度多个操作?

redux-observable - 在单个史诗中调度多个 redux 操作

使用 typescript 将异步操作发送到 redux 调度

React - Native ' Redux 未捕获错误:操作必须是普通对象。按下按钮时使用自定义中间件进行异步操作