【问题标题】:Is there a single publish-subscribe that will work in both clojure and clojurescript是否有一个可以在 clojure 和 clojurescript 中使用的发布-订阅
【发布时间】:2012-09-22 16:48:35
【问题描述】:

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

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

【问题讨论】:

    标签: clojure publish-subscribe clojurescript


    【解决方案1】:

    更新:

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

    【讨论】:

    • 感谢您提供的简单示例。我认为它可能有用。
    猜你喜欢
    • 2020-06-23
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多