在flux应用程序中,缓存逻辑应该放在哪里?

7
之前的问题中,我问过在Flux应用程序中谁负责向服务器发送更新。人们告诉我这应该由Actions完成。因此,我假设从服务器获取数据也是一样的;您需要一个FetchData action,它会获取数据并将其分派给存储区以便保存。但在这种情况下,缓存逻辑该如何工作呢?
我认为我需要在StreamsStore中存储列表最后一次请求的时间和TTL,并且fetchStreams操作将检索TTL和上次获取时间来确定是否需要查询服务器。
这是正确的方法吗?我觉得在存储区和操作之间分散缓存逻辑很奇怪,但我想不到更好的方法。
1个回答

5
这是一个很好的问题,我之前也遇到过这个问题。
请记住,Flux最重要的一点是数据总是单向流动。你已经知道了这一点,但我还是要提醒一下,因为这句话有很强的澄清能力,几乎可以回答你对Flux的任何问题。
动作将数据发送到存储区,因此,如果您在动作中添加逻辑以检查存储区中某些内容的值,则是向错误方向发送数据,违反了流程。
那么Flux应用程序的哪个部分从存储区接收数据呢?视图。这就是答案。
视图持有缓存逻辑的思想可能感觉奇怪,但是请考虑缓存是什么:
1. 我需要一些数据。 2. 我已经有这些数据了吗?如果没有... 3. 去获取它。
视图处理#1,这很简单明了。显然,#3由您的动作处理。但是,至少在Flux应用程序中,结果#2也应该在视图中处理,更具体地说,在您的控制器-视图中。控制器-视图是Flux中常常被忽视的一部分,这可能是因为控制器的概念与MVC紧密相关。但是Flux也有它们!从Flux网站上可以看到:
控制器确实存在于Flux应用程序中,但它们是控制器-视图——通常位于层次结构的顶部的视图,从存储区检索数据并将这些数据传递给其子级。
假设您正在使用React,则此想法应该听起来很熟悉。较高级别的React组件具有控制器属性,而较低级别的组件则更加“纯”。
另一种思考方式是注意动作仅是调度程序助手。(如果我记得正确,当Facebook首次介绍Flux时,他们甚至没有提到动作。)在调用操作时,您已经决定要分派的唯一问题是“什么”,而不是“是否”。
回顾这段话,我意识到这可能看起来像无关紧要的区别,但主要的观点是,不,动作不能检查存储区的状态。它们只能通过调度程序与它们通信。您可能会找到一种使其在实践中工作的方法(这不应被忽略!),但这不是典型的Flux。
希望这讲得清楚!

2
这在高层次上似乎是有道理的,但如果您有许多共享公共存储的组件,该怎么办?您是否建议在每个组件中都复制此缓存类型逻辑?对我来说,这也似乎毫无意义。 - eipark
如果您的所有组件都执行相同的缓存逻辑,则可能需要重新设计您的组件。可能需要一个基础组件,该组件具有此逻辑,并且所有依赖于此存储的其他组件都要扩展该组件。 - TheOneWhoPrograms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接