我认为我遇到了一个简单的问题,为此我也可能有一个解决方案,但我不知道"质量"我的想法。
基本上,在我的状态下,我有一个数组属性,我需要在发送另一个动作之前更新。
让我们假设我的状态是这样的:
const state = {
arrayProperty: []
}
我有一个像这样的简单动作:
const ADD_VALUE = "ADD_VALUE"
const addValue = value => ({
type: ADD_VALUE,
value
})
为了回应这个动作,在我的减速机中,我只有:
...
case ADD_VALUE:
return update(state, { arrayProperty: { $push: [action.value] }})
...
我还有一个动作可以将这个状态与服务器同步,就像这样(显然我跳过了一些部分):
const SAVE = "SAVE"
const save = model => dispatch =>
API
.save(model)
.then(
response => dispatch(saved(response))
)
const SAVED = "SAVED"
const saved = response => ({
type: SAVED,
response
})
我的问题是我想调用之前的操作,但我不知道如何在第一个操作之后获取更新后的状态,并将其传递给第二个操作。
我尝试了这个(并且它有效),但我不确定这是否是正确的方法:
const addValueAndSave = value => (dispatch, getState) => {
dispatch(addValue(value))
dispatch(save(getState()))
}
结束我的问题......这是正确的做法吗?
谢谢大家!
答案 0 :(得分:0)
据我所知,你做得对!在您要发送thunks
操作时save
,getState
将调用最新状态,这正是您想要的。现在只是为了它,你可以让整个事情只有一个异步的动作。因此,如果您的API调用失败(如果这是所需的行为),您可以执行乐观更新并还原它们。只是举个例子:
function addValue(value) {
return (dispatch, getState) => {
dispatch({
type: ADD_VALUE,
value,
});
API.save(getState()).catch(() => {
alert('Something went wrong, try again later.');
dispatch({
type: REMOVE_VALUE,
value,
});
});
};
}
或者您甚至可以创建一个中间件来为您执行特定操作,但这是完全不同的事情。我希望我可以给你一些关于你的选择的观点,但总的来说你做得对;)