【发布时间】:2017-06-29 09:06:45
【问题描述】:
假设我有一个 REST API 来编辑用户配置文件。 这里涉及到两种方法
- 一种更新用户配置文件的方法;
- 一种获取当前配置文件完成分数的方法。
当然,当用户更新他的个人资料时,我想获取完成分数。
这是我(天真的?)使用 redux 和 redux-thunk 动作创建者的方法
function updateProfileAction(userId, profile) {
return function (dispatch) {
dispatch("PROFILE_UPDATE", /*...*/)
api.updateProfile(userId, profile)
.then(repsonse => dispatch("PROFILE_UPDATE_SUCCESS", /*...*/))
// ▼ triggers the action that fetch the completion score
// this is the line that bugs me
.then(() => fetchProfileCompletionAction(userId))
}
}
这行让我感到不安:
- 它打破了单一职责原则(
udpateProfileAction突然负责也获取完成); - 它不是分形(如果我想添加一个依赖于配置文件更新的功能,我需要再次修改那段代码。
例如,如果出于某种原因,我不想再显示完成(比如说我删除了显示它的组件)并且忘记删除这行代码,fetchCompletion 将被触发但永远不会用于图形组件)。
我在想,也许在消耗完成被获取的组件中,我现在可以订阅商店和dispatch。这将使我能够以更具反应性的方式
function Completion(props) {
props.store.subscribe(state => {
//check if profile has changed
dispatch(fetchProfileCompletionAction(userId))
})
return <div> {props.completion} </div>
}
这是个好主意吗?有一个更好的方法吗?另外我猜想用这个解决方案检查相关状态是否已经改变并不是一件容易的事。
【问题讨论】:
标签: javascript reactjs redux redux-thunk