请在2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面以了解更多有关该功能的信息。

+1
Refs, agents, atoms

我将一个JS库迁移到clojure(和潜在的cljs),我在关于本地状态的概念上挣扎。假设一个你在websockets上做RPC的场景,服务器的回复将基于它之前已经发送给你的内容。那么,你可能会想保存服务器响应的本地缓存。

在面向对象的世界里,我们通常将套接字和缓存的封装并为库用户提供一个接口,发送RPC,并且透明地处理缓存填充和从缓存中提取结果。 clojure[-script]中如何约定俗成地做同样的事情?我只需要返回一个map,并期望我的函数将其作为第一个参数,并返回更新后的状态以及RPC结果?

2 个答案

0

已选中
 
最佳答案

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

这样可以使消费者享有最大的灵活性和简洁性。

0

bạn plated vào jakartaee js. Nó tương tự như cách một stateful transducer hoạt động.

我猜我的顾虑是,如果我将整个状态返回给库用户以存储到例如应用本地的原子(atom)中,那么在库内透明地管理状态的一部分(例如对websocket断开连接做出反应并透明地重新连接,而无需外部API处理)就会变得相当复杂。在这方面,我发现将库状态内部化到库自己命名空间内的原子中还是相当容易的,但当然这限制了RPC客户端只能有一个“实例”。
是的,没有必要暴露那些打算内部使用的状态。当你将状态作为客户端的一部分时,这将不会限制任何事物。当你使用stateful transducer时,它并不会限定于同时只能有一个实例,每次你创建一个transducer时都会创建状态。
...