我正在尝试编写一个游戏Crossfire,它将在clojure和ClojureScript中运行,我需要一个可以在两者中运行的发布 - 订阅机制。我见过lamina和Shoreleave,但两者都依赖于各自的环境。
我需要一个订阅者可以等待消息的事件系统。
答案 0 :(得分:4)
<强>更新强>
在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条消息,或代表整个系统的状态机,或者任何你想要的。