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