【发布时间】:2016-10-10 19:59:35
【问题描述】:
我们有一个异步获取对象的操作,我们称它为getPostDetails,它接受获取哪个帖子的参数
一个身份证。用户会看到一个帖子列表,并且可以单击其中一个以获取一些详细信息。
如果用户点击“发布 #1”,我们会发送一个 GET_POST 操作,可能看起来像这样。
const getPostDetails = (id) => ({
type: c.GET_POST_DETAILS,
promise: (http) => http.get(`http://example.com/posts/#${id}`),
returnKey: 'facebookData'
})
这是由一个中间件获取的,它向 Promise 添加一个成功处理程序,它将调用类似的操作
GET_POST__OK 带有反序列化的 JSON 对象。 reducer 看到这个对象并将其应用到 store。一个典型的
__OKreducer 长这样。
[c.GET_ALL__OK]: (state, response) => assign(state, {
currentPost: response.postDetails
})
稍后我们有一个组件,它查看currentPost 并显示当前帖子的详细信息。
但是,我们有一个竞争条件。如果用户一个接一个地提交了两个GET_POST_DETAILS操作,则
不保证我们收到 __OK 操作的顺序,如果第二个 http 请求在第一个之前完成,则
状态将变得不正确。
Action => Result
---------------------------------------------------------------------------------
|T| User Clicks Post #1 => GET_POST for #1 dispatched => Http Request #1 pending
|i| User Clicks Post #2 => GET_POST for #2 dispatched => Http Request #2 pending
|m| Http Request #2 Resolves => Results for #2 added to state
|e| Http Request #1 Resolves => Results for #1 added to state
V
我们如何确保用户点击的最后一个项目总是优先?
【问题讨论】:
标签: javascript redux