在redux document中,它们提供了一种操作方法来防止重新获取现有数据。
像这样:
function receivePosts(subreddit, json) {
return {
type: RECEIVE_POSTS,
subreddit,
posts: json.data.children.map(child => child.data),
receivedAt: Date.now()
}
}
function fetchPosts(subreddit) {
return dispatch => {
dispatch(requestPosts(subreddit))
return fetch(`http://www.reddit.com/r/${subreddit}.json`)
.then(req => req.json())
.then(json => dispatch(receivePosts(subreddit, json)))
}
}
function shouldFetchPosts(state, subreddit) {
const posts = state.postsBySubreddit[subreddit]
if (!posts) {
return true
} else if (posts.isFetching) {
return false
} else {
return posts.didInvalidate
}
}
export function fetchPostsIfNeeded(subreddit) {
return (dispatch, getState) => {
if (shouldFetchPosts(getState(), subreddit)) {
return dispatch(fetchPosts(subreddit))
}
}
}
我知道该方法可以阻止再次获取。
但是,如果我有更多api,我需要编写更多函数来判断获取情况。
这样会使我的代码更复杂,更难维护。
是否有人建议将shouldfetch*IfNeeded / shouldFetch* / fetch*
合并以使其更具可重复性?
答案 0 :(得分:0)
我推荐Sebastian Markbage(其中一个React开发者)发表这篇文章:https://www.youtube.com/watch?v=4anAwXYqLG8
除非有可能避免错误,否则基本信息不是为了避免重复代码而不是抽象的。
在这种情况下,<hr width="1" size="100" style="position: absolute; left: 30px; top: 30px; border:1px solid #717171;z-index:20" >
类型函数非常简单 - 它是一个纯函数,它接受存储状态,并进行简单检查以查看状态是否有效,并返回一个布尔值
在我看来,真的没有抽象。您可以假设您的所有异步状态都具有此形状:
shouldUpdate
和state.<asnycPartOfState>.isFetching
。
但是试图将其抽象出来似乎没有多大用处,并且限制了API的灵活性(约定优于配置)。虽然我认为惯例有时很好,但在这种情况下,我认为它不会提供很多价值。
有时候你的状态会像state.<asnycPartOfState>.didInvalidate
这样的数组,有时它只会是postsBySubreddit[<userID>]
这样的单个对象。然后它可能还需要user
,甚至可能_.findWhere(postsBySubreddit, { _id: <someID> })
。
在这种情况下,我认为最好通过避免抽象来使代码易于遵循和阅读,直到您发现需要它为止。