我正在尝试了解如何在ClojureScript中建模事件。在JavaScript中设计事件队列很容易。您只需保留一个(可变的)函数数组,并提供辅助函数来添加或删除数组中的回调。当您触发事件时,只需遍历数组中列出的所有回调并一个接一个地调用它们。
这种范式远非功能性风格 - 例如,除非它们有副作用,否则触发回调没有意义。此外,它使用可变数组实现。在我看来,在ClojureScript中,人们需要能够做事件驱动的编程来做任何有用的事情。现在,我知道Google Closure已经实现了一个事件库,但我的问题是关于本地实现它。
由于所有基本的Clojure / ClojureScript数据类型都是不可变的,实现这种机制的惯用方法是什么?改变参考?求助于来自主机的可变数据结构(Java resp JavaScript)?
如果我理解正确,代理可能是Clojure中的正确工具,但我发现它们目前尚未在ClojureScript中实现。
答案 0 :(得分:5)
Clojurescript One有一个库,one.dispatch
是一个很好的起点。维基有使用示例here
答案 1 :(得分:2)
截至2013年,在clojure中实现事件处理的最佳方法是出色的core.async
库:
core.async
以与Go
语言非常相似的方式启用事件驱动的通道编程。
答案 2 :(得分:1)
如果你想要实现这样的解决方案,那么改变一个ref / atom就好了,因为大多数clojure库等都有这样的情况,他们需要一个存储来在运行时存储/删除东西。