Reactjs 使用'分配专门用于实体创建的Redux状态是否是一种良好做法;火与遗忘';应用程序编程接口?

Reactjs 使用'分配专门用于实体创建的Redux状态是否是一种良好做法;火与遗忘';应用程序编程接口?,reactjs,asynchronous,redux,architecture,cqrs,Reactjs,Asynchronous,Redux,Architecture,Cqrs,在一些博客视频等中,有一个关于Redux的CRUD教程 它们中没有一个(冲浪后的AFAIK)在服务器上处理完全异步的API,比如点火忘记行为。 在CQRS环境中,主命令经常处理此类火灾并将其遗忘 让我们以一个虚构的Twitter为例来轻松了解这个想法: 基本上,在同步CRUD API的上下文中,您可能有: 重复操作:发布TWEET 服务器API:在响应数据中返回整个创建的tweet 状态:TweetReducer探索并存储响应中创建的tweet数据 用户界面:直接从tweet状态收听新twee

在一些博客视频等中,有一个关于Redux的CRUD教程

它们中没有一个(冲浪后的AFAIK)在服务器上处理完全异步的API,比如点火忘记行为。
CQRS环境中,主命令经常处理此类火灾并将其遗忘

让我们以一个虚构的Twitter为例来轻松了解这个想法:

基本上,在同步CRUD API的上下文中,您可能有:

  • 重复操作:发布TWEET
  • 服务器API:在响应数据中返回整个创建的tweet
  • 状态:TweetReducer探索并存储响应中创建的tweet数据
  • 用户界面:直接从tweet状态收听新tweet
除了经典的抓取API外,TweetReducer还可以完全处理POST_TWEET操作,因为它可以直接包含新的TWEET

但是,在服务器上的fire and forget API上下文中:

  • 重复操作:发布TWEET
  • 服务器API:在响应中仅返回tweet的id(例如位置)
  • 状态:TweetReducer不处理创建,因为在触发成功操作时,tweet不可用。
    因此,一个新的Redux状态专用于处理tweet创建,标记为TweetCreation,通常拥有以下属性:(
    data:{id:string},inProgress:boolean,errors:[]
    )。
    然后,它将在数据中获取新创建的tweet的id,并允许UI监听此状态(TweetCreation
  • UI:监听
    TweetCreation
    状态,因此显示tweet已发送,甚至在某个时间间隔尝试获取服务器以获取完整的tweet
有人尝试在Redux商店中添加另一个状态来处理fire and forget API,这是一种好的做法吗

这是社区中的“常规”还是有其他聪明的方法

一,。为挂起的tweet创建单独的状态 首先,您需要将
TweetCreation
更改为数组,以防用户在确认第一条tweet之前发出第二条tweet

因此,您的形状将如下所示:
{pendingTweets:[],confirmedTweets:[]}

POST_TWEET
中,您将新TWEET附加到
pendingTweets

SET_TWEET\u ID
中,从
pendingTweets
中删除匹配的TWEET,并将其推送到
confirmedTweets

在组件中,您可能会执行类似于
confirmedTweets.concat(pendingTweets.map(…)
的操作

2.对挂起的tweet使用相同的状态 形状将是
{tweets:[]}

POST_TWEET
中,将新TWEET附加到
tweets

SET_TWEET\u ID
中,您可以在
tweets
中更新匹配的TWEET

在您的组件中,您可以
tweets.map(…)

结论 对挂起的tweet使用相同的状态似乎是一种更简单(因此更好)的方法

其他注意事项(对于两种方法)
  • 我省略了更新时避免直接状态突变的细节,因为这是非常基本的
  • 您可能需要为挂起的tweet生成一个临时id并将其从服务器发回,以便在
    SET\u tweet\u id
    中找到匹配的tweet
  • 临时id可以使用不同的对象键(或使用附加标志),以便您可以区分组件中的挂起和确认推文(例如,在挂起推文旁边呈现加载图标)
  • []
    替换为
    {}
    ,使用id作为对象键可能更好(具体取决于具体要求),但这不是这个问题的重点

实际上,当要保存的tweet与最终获取的版本形状完全相同时,您的解决方案确实有意义。想象一下,在服务器上获取保存的tweet会带来完全不同的结果,比如用德语翻译所有单词。将整个tweet(直接从html表单数据中)存储在挂起的_tweet中并没有好处,因为它最终会向客户端显示错误的最终tweet状态。如果tweet有标题,我们可以想象客户端将其写为小写,服务器将其转换为大写。客户机不负责了解客户机的默认格式规则。Tweet应该以大写字母显示,而不需要在客户端中过度指定。如果我们将pending_tweets中的tweet设置为它,那么客户端将有一个无效版本。我看不出这两种方法在这种情况下有什么不同。您可能会返回整个新tweet,而不仅仅是id,然后完全覆盖匹配的tweet。“客户端将有一个无效版本”这是什么意思?为什么需要这样做?这就是我的OP的全部要点:CQRS世界中的命令API不返回实体创建的值。所谓有效,我的意思是,客户端将默认显示小写,而不是预期的默认格式为大写。