通量存储,或者操作(或两者)应该接触外部服务吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

存储是否应该是来自操作的不可变数据的哑接收方(而这些操作是在外部源之间获取/发送数据的操作?这个实例中的存储将充当视图模型,并且能够在根据操作输入的不可变数据设置自己的状态之前聚合/过滤它们的数据。

在我看来,它应该是一个或另一个(而不是两者的混合)。如果是的话,为什么其中一种优先/推荐而不是另一种呢?

提问于
用户回答回答于

存储应该是来自操作的数据的愚蠢接收者,并且写的异步处理应该在操作创建者中,按重要性排列:

  1. 你的商店变得完全同步。这使得存储逻辑更易于理解和测试--只需在给定状态下实例化存储,发送操作,并检查状态是否按预期更改。此外,流量中的核心概念之一是防止级联调度,并防止同时发生多个调度;当存储执行异步处理时,很难做到这一点。
  2. 所有动作分派都是由动作创建者发出的。如果处理存储中的异步操作,并且希望保持存储的操作处理程序保持同步(并且应该获得流量单分派保证),那么存储将需要触发额外的成功和失败操作,以响应异步处理。相反,将这些分发放到操作创建器中有助于分离操作创建者和存储的任务;此外,您不必深入研究存储逻辑,就可以确定从何处分派操作。在本例中,典型的异步操作可能如下所示(更改dispatch基于您所使用的流量的味道进行的调用): ActionCreator:函数(Userid){//现在发送一个操作,以便希望//乐观地更新其状态的存储可以这样做。_操作“,{userid:userid});//此示例使用承诺,但可以使用Node样式//回调或任何您想要的错误处理。doSomeDataAccessLayer.doSomething(Userid).然后(Function(NewData){//Stores,乐观地更新后可能不会使用“成功”操作///做任何事情,可能会停止显示//加载指示符等分派(“一些”)_行动_“成功”,{userid:userid,newData:newData};},函数(错误){//Stores可以通过监视错误案例回滚。_行动_失败“,{userid:userid,Error:Error};});} 否则可能在不同操作之间重复的逻辑应该提取到一个单独的模块中;在本例中,该模块将被提取到一个单独的模块中。SomeDataAccessLayer,它处理实际的Ajax请求。
  3. 你需要更少的行动创造者。这没什么大不了的,但很高兴。存储具有同步操作分派处理(而且它们应该),那么将需要触发额外的操作来处理异步操作的结果。在操作创建者中执行调度意味着单个动作创建者可以通过处理异步数据访问本身的结果来分派所有三种操作类型
用户回答回答于

我把这个问题发到Facebook的开发者那里

当响应用户与UI的交互时,我会在动作创建者方法中进行异步调用。 但是,当你有一个代码或其他非人类的司机时,从商店打来的电话效果会更好。 重要的是在错误/成功回调中创建一个操作,这样数据总是与操作一起产生。

扫码关注云+社区