2012-10-18 98 views
3

假設我有一個名爲main的Clojurescript名稱空間,其中包含一個名爲state的原子。在Clojure和Clojurescript之間共享原子?

(ns main) 

(atom state nil) 

我編譯我的Clojurescript的應用程序,一臺服務器上運行它,火起來的Clojurescript REPL,然後使用瀏覽器連接到我的服務器。一切都很正常。

在Clojurescript REPL,我可以comfirm通常

> (+ 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!)設置Clojures應用程序中Clojurescript原子的值。我想知道是否有一種方法可以在我的Clojurescript項目中的一個原子的值與正在運行的Clojure應用程序之間建立聯繫。也許Clojurescript客戶端連接到指定的端口並將結果發送到某個等待該端口的Clojure服務器。簡單地說,我想知道是否有可能讓正在運行的服務器應用程序共享客戶端原子的值。

爲什麼,你可能會問?那麼,我認爲在正在運行的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的值。這是否有可能,還是我只是在做夢?

回答

2

當然,只要發送請求給休息API發送EDN format中的數據,瞧!如果您想避免輪詢,請考慮在Nginx實例後面運行Jetty或Tomcat以利用Nginx HTTP Push Module。我有一個有點蛛網眼的例子here(這是ClojureScript之前的版本,所以我用普通的JS編寫了客戶端)。而且還有gifsockets