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

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

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


person M Smith    schedule 22.09.2012    source источник


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

person levand    schedule 23.09.2012
comment
Спасибо за простой пример. Думаю может послужить. - person M Smith; 24.09.2012