clojureとClojureScriptの両方で実行されるゲームCrossfireを作成しようとしていますが、両方で機能するパブリッシュ/サブスクライブメカニズムが必要です。ラミナとショアリーブを見たことがありますが、どちらもそれぞれの環境に依存しています。
加入者がメッセージを待つことができるイベントシステムが必要です。
clojureとClojureScriptの両方で実行されるゲームCrossfireを作成しようとしていますが、両方で機能するパブリッシュ/サブスクライブメカニズムが必要です。ラミナとショアリーブを見たことがありますが、どちらもそれぞれの環境に依存しています。
加入者がメッセージを待つことができるイベントシステムが必要です。
アップデート:
この質問は、core.asyncがリリースされる前に質問され、回答されました。core.asyncはこの問題を正確に解決するように設計されているので、今後のすべてのプロジェクトで間違いなく使用する必要があります。
元の答え:
本当に非同期ではありませんが、私はこれにアトムとウォッチャーを使用するのがとても好きになりました。非常にシンプルですが柔軟性の高いモデルであり、両方の言語に組み込まれています。
非常に簡単な例:
(def my-channel (atom nil))
;; subscribe
(add-watch my-channel :watcher1
(fn [_ _ _ message]
(js/alert (str "Received message: " message))))
;; publish
(reset! my-channel "my-message")
;; unsubscribe
(remove-watch my-channel :watcher1)
このアプローチの利点は、原子の状態が任意のオブジェクトになり得ることです。ここでは、メッセージのアトムの状態をリセットしているだけですが、アトムの状態をメッセージの完全な履歴、最後の5つのメッセージ、システム全体を表すステートマシン、またはその他の状態にすることもできます。欲しいです。