假设我有一个名为main的Clojurescript命名空间,其中包含一个名为state的原子。
(ns main)
(atom state nil)
我编译我的Clojurescript应用程序,在服务器上运行它,启动Clojurescript repl然后使用浏览器连接到我的服务器。一切都很有效。
在Clojurescript repl中,我可以确认通常的
> (+ 1 1)
2
> (js/alert "Hey there") //shows an alert dialog with "Hey there" in the browser
nil
> main.state
(atom nil)
Clojurescript repl非常适合开发。所以,显然我可以得到(使用swap!或reset!)从Clojure应用程序设置Clojurescript原子的值。我想知道是否有办法在我的Clojurescript项目中的一个原子的值和一个正在运行的Clojure应用程序之间建立连接。也许Clojurescript客户端连接到指定的端口并将结果发送到等待该端口的某个Clojure服务器。简单地说,我想知道是否有可能让正在运行的服务器应用程序共享state
客户端原子的值。
为什么,你可能会问?好吧,我认为在运行的Clojurescript应用程序中修改state
时,将state
原子的值写入实际文件(state.clj)会很好。这样,我总能看到state
的当前值。我可以使用emacs (global-auto-revert-mode t)
之类的东西来确保state.clj缓冲区总是相当新的。这有点像调试器。
除此之外,我真正希望这样做,以便正在运行的Clojure应用程序也会周期性地轮询state.clj本身。当服务器检测到我修改了state.clj时,它会接受修改作为Clojurescript state
原子的新值。然后它将执行类似Clojurescript repl所做的事情,如下面的伪代码所示:
(send-to-client-for-evaluation
(compile-into-js
(reset!
main.state
the-read-string-value-of-the-content-of-state.clj)))
基本上,我希望服务器具有类似于客户端和服务器之间的共享原子的能力。我希望在客户端和服务器之间双向共享state
的值。这有可能,还是我只是在做梦?
答案 0 :(得分:2)
当然,只需向EDN format发送数据的其他API发出请求,瞧!如果要避免轮询,请考虑在Nginx实例后面运行Jetty或Tomcat以使用Nginx HTTP Push Module。我有一个有点蜘蛛网的例子here(这是前ClojureScript,所以我用普通的JS编写了客户端)。还有gifsockets。