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】:
中间件内部的next
和dispatch
之间存在差异。 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 thunk - 错误 · 动作必须是普通对象。使用自定义中间件进行异步操作,即使调度具有键类型的对象
redux-observable - 在单个史诗中调度多个 redux 操作