4

我正在尝试编写一个可以在 clojure 和 ClojureScript 中运行的游戏Crossfire,我需要一个可以在两者中运行的发布-订阅机制。我见过laminaShoreleave,但两者都依赖于各自的环境。

我需要一个事件系统,订阅者可以在其中等待消息。

4

1 回答 1

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 条消息,或者代表整个系统的状态机,或者任何你想要的想。

于 2012-09-23T16:03:17.000 回答