Есть ли одна публикация-подписка, которая будет работать как в clojure, так и в clojurescript


Я пытаюсь написать игру, Crossfire , которая будет работать как в clojure, так и в ClojureScript, и мне нужен механизм публикации-подписки, который будет работать в обоих. Я виделlamina иShoreleave , но оба зависят от их соответствующих сред.

Мне нужна система событий, в которой абонент может ждать сообщения.

1 4

1 ответ:

Обновление:

Этот вопрос был задан и на него был дан ответ перед ядром.асинхронность была выпущена. ядро.асинхронность предназначена именно для решения этой проблемы, вы обязательно должны использовать ее для всех проектов, идущих вперед.

Оригинальный ответ:

Это не совсем асинхронно, но мне очень нравится использовать для этого атомы и наблюдателей. Очень простая, но очень гибкая модель, встроенная в оба языка.

Чрезвычайно простой пример:

(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 сообщений, или государственную машину, представляющую всю вашу систему, или все, что вы хотите.