我知道不要把副作用放在reducer中,我也知道有很多关于如何处理异步操作的精彩解释。我已经读过了。我有一个特殊的问题,我被绊住了。谢谢!我有一个具体的问题,我被搞糊涂了。
我有 state.largeObject
是一个有许多条目的对象。我有一个还原器,它可以做一些复杂的逻辑,并将结果合并到 state.largeObject
像这样。
export const myReducer = (state, { input }) => {
const largeObject = doSomethingComplex(input)
// other logic that uses largeObject
return {
...state,
largeObject: {
...state.largeObject,
...largeObject
}
}
}
我想保存以下结果 doSomethingComplex(input)
到服务器。副本效果放在哪里? 编辑:在不重复的情况下 doSomethingComplex
在减速器中的其他逻辑仍然需要它。
myReducer
或 doSomethingComplex
因为它们是纯粹的。doSomethingComplex
在reducer和中间件中都有。我缺少什么?谢谢!我知道不要把副作用放进去。
中间件、thunks和存储订阅回调都是有效的地方。
根据你的措辞,我不确定你是否想发送... ... 只是 调用服务器的结果,或者说是做了 {...state.largeObject, ...largeObject}
.
在我看来,最合适的方法是将整个的。减速器 逻 doSomethingComplex
函数)到服务器端。
所以,你要做的就是调度动作并向API发送所需的参数。如果有成功的响应,你就会调度出 成功 行动,号召 myReducer
并将结果保存在商店中。
然而如果你真的想把这个逻辑保留在前端,你必须使用一个中间件--thunks或者sagas(我更喜欢sagas)。
// some pseudo code //
dispatch the action
- inside the middleware -
call doSomethingComplex() // called once and stored in some variable
dispatch action that will call the reducer and store the result
call API with the result
但我还是推荐第一种解决方案,因为(第二种)方法可以工作,但可能会破坏适当的数据流。
编辑:一些最后的想法--如果你真的想把这些计算留在前端,可以考虑按照策略。
doSomethingComplex
功能doSomethingComplex
返回doSomethingComplex
返回--从API中以 成功 回应这样才能保持适当的数据流的活力。