是否有一个发布 - 订阅将在clojure和clojurescript中工作

时间:2012-09-22 16:48:36

标签: clojure publish-subscribe clojurescript

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

我需要一个订阅者可以等待消息的事件系统。

1 个答案:

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