【发布时间】:2012-09-22 16:48:35
【问题描述】:
我正在尝试编写一个游戏,Crossfire,它将在 clojure 和 ClojureScript 中运行,我需要一个可以在两者中运行的发布-订阅机制。我见过lamina 和Shoreleave,但两者都依赖于各自的环境。
我需要一个订阅者可以等待消息的事件系统。
【问题讨论】:
标签: clojure publish-subscribe clojurescript
我正在尝试编写一个游戏,Crossfire,它将在 clojure 和 ClojureScript 中运行,我需要一个可以在两者中运行的发布-订阅机制。我见过lamina 和Shoreleave,但两者都依赖于各自的环境。
我需要一个订阅者可以等待消息的事件系统。
【问题讨论】:
标签: clojure publish-subscribe clojurescript
更新:
这个问题是在 core.async 发布之前提出并回答的。 core.async 旨在准确解决这个问题,您绝对应该将它用于所有未来的项目。
原答案:
这并不是真正的异步,但我已经非常喜欢为此使用原子和观察者。非常简单但高度灵活的模型,并且内置于两种语言中。
一个极其简单的例子:
(def my-channel (atom nil))
;; subscribe
(add-watch my-channel :watcher1
(fn [_ _ _ message]
(js/alert (str "Received message: " message))))
;; publish
(reset! my-channel "my-message")
;; unsubscribe
(remove-watch my-channel :watcher1)
这种方法的美妙之处在于原子的状态可以是任何对象。在这里,我只是简单地重置消息的原子状态,但您也可以将原子的状态设置为消息的完整历史记录,或者最后 5 条消息,或者代表整个系统的状态机,或者任何你想要的想。
【讨论】: