2024 Clojure状态调查!中分享你的想法。

欢迎!请查看关于页面以了解更多这个网站的工作方式。

+1
引用、代理、原子

我将一个 JS 库移植到 Clojure(以及,潜在地 cljs),我在理解局部状态方面遇到麻烦。想象一下这样的场景:你通过 WebSocket 进行 RPC,服务器的响应依赖于它已经发送给你的内容。那么,你想要保留来自服务器的响应的本地缓存。

在面向对象的世界中,你期望将套接字和缓存封装起来,并提供一个接口,使库用户可以发送 RPC 并透明地处理缓存的填充和从缓存中提取结果。在 Clojure[-Script] 中,要想实现相同的做法,会是什么惯用方法?我会只需要返回一个映射,并期望我的函数将其作为第一个参数传入,返回更新后的状态以及 RPC 的结果吗?

2 个答案

0

被选中
 
最佳答案

是的,明确定义状态,将其作为参数传递。不要使用全局状态。也不要使用动态变量。不要假设特定的状态框架,如 Integrant 或 Component。

这种方式将为消费者提供最大的灵活性和简单性。

0
by

你在JavaScript中处理它的方式没有问题。这类似于任何有状态的转换器的工作方式。

by
我猜我在这里的担忧是,如果我将整个状态返回给库用户以存储在例如应用本地的atom中,那么在库中透明地管理这部分状态就变得非常不简单(例如,在WebSocket关闭时做出反应并透明地重新连接,而不需要通过外部API处理)。在这方面,我发现将库状态在库自己的命名空间中的atom内部化做得相当容易,但当然,这限制了RPC客户端恰好只有一个"实例"。
by
是的,没有必要暴露打算内部化的状态。如果你把状态作为客户端的一部分,这不会限制任何事情。当你使用有状态的转换器时,它不会限制为同一时间只有一个实例 - 每当你创建一个转换器时,都会创建一个状态。
...