Предположим, у меня есть пространство имен Clojurescript с именем main с атомом внутри него, называемым состоянием.
(ns main)
(atom state nil)
Я компилирую приложение Clojurescript, запускаю его на сервере, запускаю ответ Clojurescript и затем подключаюсь к своему серверу с помощью браузера. Все работает денди.
В ответе Clojurescript я могу подтвердить обычный
> (+ 1 1)
2
> (js/alert "Hey there") //shows an alert dialog with "Hey there" in the browser
nil
> main.state
(atom nil)
Ответ Clojurescript отлично подходит для разработки. Итак, ясно, что я могу получить и (используя swap! Или reset!) Установить значение атома Clojurescript из приложения Clojure. Мне было интересно, есть ли способ установить связь между значением атома в моем проекте Clojurescript и работающим приложением Clojure. Возможно, клиент Clojurescript подключается к указанному порту и отправляет результат на какой-то сервер Clojure, ожидающий этого порта. Проще говоря, мне было интересно, возможно ли, чтобы работающее серверное приложение разделяло значение state
клиентского атома.
Почему, спросите вы? Ну, я подумал, что было бы неплохо записывать значение атома state
в фактический файл (state.clj) всякий раз, когда state
изменяется в работающем приложении Clojurescript. Таким образом, я всегда мог видеть текущее значение state
. Я мог бы использовать что-то вроде emacs (global-auto-revert-mode t)
, чтобы убедиться, что буфер state.clj всегда был достаточно свежим. Это немного похоже на отладчик.
Кроме того, мое настоящее желание - сделать так, чтобы работающее приложение Clojure также периодически опрашивало сам state.clj. Когда сервер обнаруживает, что я изменил state.clj, он примет изменение как новое значение атома Clojurescript state
. Затем он будет делать что-то вроде того, что делает повтор Clojurescript, проиллюстрированный в следующем псевдокоде:
(send-to-client-for-evaluation
(compile-into-js
(reset!
main.state
the-read-string-value-of-the-content-of-state.clj)))
По сути, я хочу, чтобы сервер имел что-то вроде общего атома между клиентом и сервером. Я хочу, чтобы значение state
распределялось между клиентом и сервером двунаправленно. Возможно ли это, или я просто мечтаю?