在Clojure和Clojurescript之间共享一个原子?

时间:2012-10-18 02:37:40

标签: clojure clojurescript

假设我有一个名为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的值。这有可能,还是我只是在做梦?

1 个答案:

答案 0 :(得分:2)

当然,只需向EDN format发送数据的其他API发出请求,瞧!如果要避免轮询,请考虑在Nginx实例后面运行Jetty或Tomcat以使用Nginx HTTP Push Module。我有一个有点蜘蛛网的例子here(这是前ClojureScript,所以我用普通的JS编写了客户端)。还有gifsockets