我应该如何在Redux中获取关系/嵌套数据?

时间:2017-10-30 21:53:30

标签: ajax reactjs asynchronous react-redux

处理以下情况的最佳效果是什么?有没有一种不同的方法来处理这个(我描述的选项除外)效率更高?是否有标准'管理它的方式?

说我有以下端点:

/posts

/users

获取/发布:

[{
id: 1, 
title: 'Some post',
userId: 1,
...other post data
},
...more posts
]

GET / users / 1:

[{
id: 1, 
name: 'ExampleUser',
...other user data
},
...more users
]

我想返回一个帖子列表,其中显示了有关创建它们的用户的一些基本信息。为此。我需要获取帖子列表,然后为每个帖子获取用户。一个用户可能在多个帖子中被引用。

React组件被组织为(伪代码):

<PostsList posts={posts}>
<Post post={post}>
<UserInfo user={user} />
</Post
</PostsList>

选项A:在PostsList中调度(fetchPosts()),然后在每个帖子(或每个UserInfo)中调度(fetchUser(post.userId)

优点:非常容易实施;不需要专门的行动(即fetchPostsWithUserInfo())

缺点:必须将多个组件连接到商店;知道何时渲染组件或加载微调器可以进入复杂的逻辑;可以多次获取同一个用户(即使fetchUser(post.userId)调度在启动操作时正在获取用户的操作记录,这似乎并不能完全防止重复调用)。

选项B:处理操作

const fetchPostsWithUsers = () => dispatch => {
dispatch(fetchPostsWithUsersStart());

fetchPostsFromServer()

.then(res => {
dispatch(fetchPostsSuccess());
const users = getListOfUniqueUserIds(res.data);
users.forEach(userId => dispatch(fetchUser(userId)));
})

.catch(err => dispatch(fetchPostsError()));
}

优点:没有重复的电话,更少的连接组件

缺点:仍然存在大量加载检查的问题;如果某些呼叫失败可能会丢失信息;密切联系帖子调用用户数据获取

选项C:与选项B类似,但使用Promise.all获取用户数据,然后只有一次成功调用(dispatch(fetchPostsWithUserDataSuccess())

优点:更少的加载检查,全部或全部,因此没有部分丢失的数据

缺点:全有或全无,如果一旦获取失败,则必须重新获取所有数据;响应时间较慢,因为在任何数据可用之前需要等待所有单个呼叫完成

我已经尝试了很长时间才能找到关于这个主题的信息,但我找不到任何令我惊讶的信息,因为我认为这是一个常见的情况。可能我只是不知道描述问题的正确术语,在这种情况下,我非常希望知道正确的术语。

1 个答案:

答案 0 :(得分:0)

选项A 是不错的选择,因为您可以单独重复使用每个容器组件。您只需要 去抖 获取提醒,这样相同的系统就不会同时运行多次。