Gmail风格的收藏夹/星级功能的大致架构是什么?

时间:2019-03-05 23:27:30

标签: node.js reactjs amazon-web-services redux amazon-dynamodb

我首先要说我们当前正在使用的堆栈。但是,我们愿意接受其他建议,因为这个问题(主要归结为响应时间问题)在我们的整个应用程序中都很盛行。

后端:具有NodeJS,Restify和其他分类库的AWS ELB EC2实例,已连接到DynamoDB。

前端:与Redux反应。

我正在尝试构建一个功能,该功能可以在基于React的前端上存档某些数据。实际上,这与使用StackOverflow在Gmail或<---中的帖子或电子邮件“加注星标”或“收藏”非常相似。

对我来说,这表面上似乎是一个非常简单的问题。但是当我进一步研究它时,它变得更加复杂。

主要问题来自一个事实:如果我单击“星形”图标,它将生成一个请求并更改其图像。但是,在大多数情况下,我将等待响应,然后再更改前端的相应值,以防止发生冲突。问题是,我们的请求时间太长了。 Gmail和SO会立即显示已加星标和未加星标之间的转换,我觉得如果该功能仅用于此功能,用户将不满意。

如果我只是允许它在前端自由更改,而忽略了它所生成的请求的响应,那么我会非常迅速地参与竞赛和冲突问题。尤其是考虑到我们希望能够“全选”并在200多个记录的表上加注星标(存档)。

那么这里的答案是什么?老实说,我完全不知所措。

2 个答案:

答案 0 :(得分:3)

我认为在这里可能有用的概念是“乐观UI”。这是一种通常用于您描述的模式,以保持与用户的紧密反馈循环,从而向他们指示用户的操作已完成某件事,并在某些事情(例如HTTP请求)异步运行时假定了积极的结果,以及是错误,您可以还原为肯定状态并向用户发出警告。

在React的实践中,如果您使用Redux之类的东西,则可以创建某种“归档”操作,该操作将每个选定项目的状态设置为reducer中的“已归档”,并同时启动向后端的请求,以使用存档状态更新服务器。假设您使用async/await创建服务器请求,则可以将其包装在try/catch中,其中catch检测到失败的请求并还原化简器中所选项目的“已归档”状态,并且可能会向用户显示错误消息。

答案 1 :(得分:2)

如评论中所述,我认为最好的方法是“希望达到最好”。

用户期望按下星号按钮时不会有任何问题,因此,除了点亮星号之外,任何其他操作都会使用户感到震惊。当然,您需要在后端验证该星星,但与此同时,您将假定它会成功并点亮星星。

请求完成后,假设一切正常,并且星标有效,用户不会注意到任何东西,并且交互按照预期的方式进行。

如果请求完成并且由于某种原因星号无效,则您将不得不显示某种类型的错误消息并取消星标。