4

假设我有一个名为 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 非常适合开发。因此,显然我可以从 Clojure 应用程序中获取并(使用交换!或重置!)设置 Clojurescript 原子的值。我想知道是否有办法在我的 Clojurescript 项目中的原子值和正在运行的 Clojure 应用程序之间建立联系。或许 Clojurescript 客户端连接到指定端口并将结果发送到某个在该端口上等待的 Clojure 服务器。简单地说,我想知道是否有可能让正在运行的服务器应用程序共享state客户端原子的值。

为什么,你可能会问?好吧,我认为只要在运行的 Clojurescript 应用程序中进行修改,将原子的值写入state实际文件 (state.clj)会很好。state这样,我总能看到 的当前值state。我可以使用诸如 emacs 之类的东西(global-auto-revert-mode t)来确保 state.clj 缓冲区始终是最新的。这有点像拥有一个调试器。

除此之外,我真正的愿望是让运行中的 Clojure 应用程序也定期轮询 state.clj 本身。当服务器检测到我修改了 state.clj 时,它会接受修改作为 Clojurescriptstate原子的新值。然后它会做类似于 Clojurescript repl 所做的事情,如以下伪代码所示:

(send-to-client-for-evaluation
  (compile-into-js 
    (reset! 
      main.state 
      the-read-string-value-of-the-content-of-state.clj)))

基本上,我希望服务器能够拥有类似于客户端和服务器之间共享原子的东西。我希望在state客户端和服务器之间双向共享的值。这有可能吗,还是我只是在做梦?

4

1 回答 1

2

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

于 2012-10-18T06:17:47.203 回答