对于可能有点困惑的未来读者:我们不再称这些函数为“存储”:我们称它们为“存储”reducers http://rackt.github.io/redux/docs/basics/index.html。所以问题是关于一个记住动作的减速器 https://github.com/gabrielgiussi/redux_actionsStore/blob/2e948b8ea616ea9f1289d0b6e5d2f60d82545f11/js/src/common/ActionStore.js.
就我个人而言,我不喜欢你在那里建议的方法。您将逻辑放入操作中并为此使用继承。相反,Redux 将操作规定为没有逻辑的普通对象。他们不应该“知道”如何更新某些状态,也不应该保留它——相反,他们应该描述发生了什么。
我认为在 Redux 中实现乐观更新的方法与您的方法类似在 Redux 中实现撤销 https://github.com/omnidan/redux-undo,这反过来又受到启发榆树建筑 https://github.com/evancz/elm-architecture-tutorial/。这个想法是,您应该编写一个函数,它接受一个减速器(和一些选项)并返回一个减速器:
function optimistic(reducer) {
return function (state, action) {
// do something?
return reducer(state, action);
}
}
你可以像普通的减速器一样使用它:
export default combineReducers({
something: optimistic(something) // wrap "something" reducer
})
现在它只是将状态和操作传递给reducer
它会包装,但它也可以“记住”动作:
function optimistic(reducer) {
return function (state = { history: [] }, action) {
// do something with history?
return {
history: [...state.history, action],
present: reducer(state.history[state.history.length - 1], action)
};
}
}
现在它累积了所有动作history
field.
同样,这本身并不是很有用,但您可能会看到如何实现这样的高阶减速器:
- 通过 ID 跟踪待处理的异步操作,并在看到带有以下内容的操作时开始记录历史记录
status: 'request'
;
- 当它收到一个动作时
status: 'done'
,重置历史记录;
- 当它收到一个动作时
status: 'fail'
,调整历史记录以不包括初始操作status: 'request'
and 重新运行减速器以重新计算当前状态,就好像请求从未发生过一样。
当然,我没有提供实现,但这应该让您了解如何以 Redux 方式实现乐观更新。
更新:根据OP的评论,还原乐观主义者 https://github.com/ForbesLindesay/redux-optimist似乎正是这样做的。