Есть ли одна публикация-подписка, которая будет работать как в clojure, так и в clojurescript
Я пытаюсь написать игру, Crossfire , которая будет работать как в clojure, так и в ClojureScript, и мне нужен механизм публикации-подписки, который будет работать в обоих. Я виделlamina иShoreleave , но оба зависят от их соответствующих сред.
Мне нужна система событий, в которой абонент может ждать сообщения.
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 сообщений, или государственную машину, представляющую всю вашу систему, или все, что вы хотите.