在学习 GraphQL 和 Apollo 时,我浏览了这个教程系列。
它展示了如何创建一个应用程序,它具有:
- 频道列表视图 (
/
)- 显示所有频道
- 允许打开频道详细信息视图
- 允许创建新频道
- 频道详细信息视图(即
/soccer
)- 显示添加到频道的消息
- 允许用户添加新消息
Apollo 默认缓存查询,这会带来一个问题:
- 打开通道(
/soccer
),第一次,缓存中没有数据,执行查询并将结果存储在缓存中 - 返回频道列表视图
- 打开不同的频道 (
/baseball
) - 其他访客添加消息
/soccer
- 返回频道列表视图
- 打开通道 (
/soccer
),由于存储中存在数据 - 加载过时的数据,因为没有任何内容表明数据过时并且应该重新获取
我似乎找不到一个合理的方法来解决它。不是在寻找代码,只是一些关于如何使用 GraphQL 处理它的良好实践。
我尝试更改fetchPolicy
为cache-and-network
,但它不要求提供更多数据 - 同样适用,没有任何内容表明数据已过时。network
可行,但这会绕过缓存 - 当它符合要求时,这是一个可行的解决方案,但我实际上并不想要一些缓存。
我想到的可能选项:
- 单独查询:一个用于主频道详情,一个用于消息。将消息设置
fetchPolicy
为network
。可行的选项,但发送已经可用的数据。 - 单独的查询。消息正在分页。加载时确定是否首先加载和
fetchMore
。 - 利用通知服务器端事件的 GraphQL 订阅,使用它来确定是否应该重新获取。介绍了许多其他细微差别,例如,如果我已经离开频道 X,我应该听多长时间的事件。
我知道这取决于项目,但还有哪些其他选择,哪些是受欢迎的,为什么?