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 アトムの値を (swap! または reset! を使用して) 取得および設定できることは明らかです。Clojurescript プロジェクトのアトムの値と実行中の Clojure アプリケーションを関連付ける方法はないかと考えていました。おそらく、Clojurescript クライアントは指定されたポートに接続し、そのポートで待機している Clojure サーバーに結果を送信します。state簡単に言えば、実行中のサーバー アプリケーションでクライアント アトムの値を共有できるかどうか疑問に思っていました。

なぜ、あなたは尋ねるかもしれませんか?実行中の Clojurescript アプリケーションで が変更さstateれるたびに、アトムの値を実際のファイル (state.clj)に書き込むとよいと考えていました。stateこのようにして、常に の現在の値を確認できますstate(global-auto-revert-mode t)state.clj バッファーが常にかなり最近のものであることを確認するために、emacs のようなものを使用できます。これは、デバッガを使用することに少し似ています。

それ以上に、私の本当の望みは、実行中の 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

もちろん、残りの API にEDN 形式でデータを送信するようにリクエストするだけで、出来上がりです! ポーリングを回避したい場合は、Jetty または Tomcat を Nginx インスタンスの背後で実行して、Nginx HTTP Push Moduleを利用することを検討してください。ここにややクモの巣状の例があります(これは ClojureScript よりも前だったので、プレーンな JS でクライアントを書きました)。そしてgifsocketsもあります。

于 2012-10-18T06:17:47.203 に答える