当前位置: 首页 > 面试题库 >

通量存储或动作(或两者)是否应该涉及外部服务?

章哲彦
2023-03-14
问题内容

商店应该保持自己的状态并能够调用网络和数据存储服务……在这种情况下,这些动作只是愚蠢的消息传递者,

-要么-

…商店应该是动作中不可变数据的愚蠢接收者(而动作是在外部源之间获取/发送数据的动作吗?在这种情况下,商店将充当视图模型,并且能够聚合/过滤它们的数据根据动作所馈送的不可变数据来设置自己的状态之前。

在我看来,它应该是一个或另一个(而不是两者混合)。如果是这样,为什么一个偏爱/推荐另一个偏爱?


问题答案:

我已经看到了两种方式都实现了通量模式,并且我自己都做完之后(最初采用了前一种方法),我认为存储应该是动作中数据的愚蠢接收者,并且异步处理写操作应该存在于动作创作者。(异步读取的处理方式可能有所不同。)以我的经验,按重要性顺序,它有一些好处:

  1. 您的商店将完全同步。 这使您的商店逻辑更易于遵循和测试,非常容易-只需使用某种给定状态实例化商店,向其发送操作,然后检查状态是否按预期更改。此外,流量中的核心概念之一是防止级联调度并一次阻止多个调度。当商店进行异步处理时,这很难做到。

  2. 所有动作分派均由动作创建者执行。 如果您在商店中处理异步操作,并且希望使商店的动作处理程序保持同步(并且应该为了获得通量单次派发保证),则商店将需要触发其他SUCCESS和FAIL动作以响应异步处理。相反,将这些调度放到动作创建者中有助于将动作创建者和商店的工作分开;此外,您不必深入研究商店逻辑即可确定从何处调度操作。在这种情况下,典型的异步操作可能看起来像这样(dispatch根据您使用的助焊剂的风味更改调用的语法):

        someActionCreator: function(userId) {
      // Dispatch an action now so that stores that want
      // to optimistically update their state can do so.
      dispatch("SOME_ACTION", {userId: userId});

      // This example uses promises, but you can use Node-style
      // callbacks or whatever you want for error handling.
      SomeDataAccessLayer.doSomething(userId)
      .then(function(newData) {
        // Stores that optimistically updated may not do anything
        // with a "SUCCESS" action, but you might e.g. stop showing
        // a loading indicator, etc.
        dispatch("SOME_ACTION_SUCCESS", {userId: userId, newData: newData});
      }, function(error) {
        // Stores can roll back by watching for the error case.
        dispatch("SOME_ACTION_FAIL", {userId: userId, error: error});
      });
    }

否则可能会在各种动作之间重复的逻辑应提取到单独的模块中;在此示例中,该模块将是SomeDataAccessLayer,该模块处理实际的Ajax请求。

  1. 您需要较少的动作创建者。 这没什么大不了的,但是很高兴。如#2所述,如果您的商店具有同步操作分派处理(并且应该这样做),则需要触发额外的操作来处理异步操作的结果。在动作创建者中进行分派意味着单个动作创建者可以通过处理异步数据访问本身的结果来分派所有三种动作类型。


 类似资料:
  • 这是我第一次使用IdentityServer4和AspNetIdentity设置OpenID Connect,我希望有人能揭开关于存储用户数据的神秘面纱。 到目前为止,我读到的是,用户数据应该存储在连接到Auth服务器的Auth db中,但我真的希望将用户数据存储在连接到资源服务器的资源db中。 我目前有一个如下所示的数据模型: 还有人说,与Auth无关的数据,如用户的城市或国家,不应该存储在Au

  • 在MS Access中,'ListBox'可以隐藏一个2列结果集的第一个'column'--它非常适合隐藏'ID',当用户从列表中选择一个项目时,IDS很容易访问。 如果可能的话,我希望在JavaFX中用ListView做同样的事情,这样我就可以根据第一个ListView中的选择填充第二个ListView。 以下是我填充ListView的方式:从 多谢

  • 我有一个关于在junits中使用EasyMock的问题。我们已经为junits配置了一个框架,它使用inmemory derby数据库和EasyMock来测试我们的服务项目。我们将内存中的derby完全用于dao层。问题出现在天气上,是完全使用EasyMock还是在服务层中同时使用EasyMock和derby。以下是场景: 被测试的类在用户服务项目中,IUserService接口也是如此。IAdd

  • 新手问题。我最近遇到了一个包含大量文件和外部库的项目。其中一些库包含Makefiles和CmakeList。txt。我正在建设一个类似的项目,涉及外部图书馆。有必要同时学习CMake和make吗。还是说CMake就足够了?

  • 问题内容: 我在尝试在Jenkins管道脚本中执行代码时遇到一些令人困惑的行为。闭包内部的值带有一些意外值。我已经看到了对局部变量技巧的引用,该技巧据说可以解决此问题,但是它对我不起作用。 简化示例:创建3个作业’a’,’b’,’c’,以打印其参数- 传入并复制到本地。首先并行执行作业;然后在外部并行执行以比较结果。之所以定义“说”,是因为println在我的Jenkins中提供了访问异常(我不是

  • 我正在阅读有关数据位置的内容,并想用它来改进我正在编写的游戏引擎。 假设我在不同时间创建了五个对象,它们现在都在内存中的不同位置,而不是彼此相邻。如果我将它们全部添加到一个数组中,该数组是否只保存指向这些对象的指针,并且它们将留在内存中的相同位置,或者将它们全部添加到数组中重新排列并使它们连续。 我问这个问题是因为我认为使用数组是使它们连续的好方法,但我不知道数组是否会解决我的问题!