私はImmutable JSに遭遇しましたが、プログラマのエラーや偶発的な変異、それが提供するパフォーマンスの最適化によるバグの可能性を減らすための非常に興味深いライブラリのように思えます。モジュール内の状態を追跡します。Immutable JSでグローバルモジュール状態の概念を無視しなければならないのですか?
var clients = []
var streams = []
:私は複数のストリームをサポートsocket.ioサーバが稼働していた場合
例えば、私は通常、接続されたクライアントおよび現在利用可能なストリームを追跡するために、そのモジュールのグローバルな文脈で2つの変数を持っていますユーザーが接続しようとしていた場合、ソケットリスナーio.on("connection")
のイベントリスナーに.push
を単に使用するだけで、クライアント状態に新しく接続されたソケットが含まれるようになります。私はグローバルな状態を更新することができますどのように、ソケットIOの接続ハンドラの内部
var state = Immutable.Map({
clients : Immutable.List.of(),
streams : Immutable.List.of()
})
:不変JSで
、私は今のように見えるモジュールにグローバルオブジェクトがありますか?私は、私はにconsole.logステートメントと信じて、私の理解から、// Define the Immutable array, this remains constant throughout the application
var state = Immutable.Map({
clients : Immutable.List.of(),
streams : Immutable.List.of()
})
io.on("connection", (socket) => {
console.log(state.clients)
// I would like to update the state of clients here, but I believe that
// I am only able to make a local copy within the context of the current
// scope, I would then lose access to this on the next socket joining?
var clientsArray = state.clients
clientsArray.push(socket)
state.set("clients", clientsArray)
console.log(state.clients)
})
ので、アプリケーションの状態を維持することも、(なぜなら私は現在、それについて考えています道の)可能性は思えない、不変のJSは、このように動作します信じています次の出力で結果を結ぶだろう2つのクライアント上:私は
[ { socket object }, { socket object } ]
を取得したり、私は五井午前なるように、私はオブジェクトを更新するため
// First client connects
[]
[ { socket object } ]
// Second client connects
[]
[ { socket object } ]
は可能ですグローバルな可変状態の使用に固執する必要がありますか?私がこの質問をする唯一の理由は、過去に反応を使用したときに、メソッド内のコンポーネント状態を更新し、その新しい状態をコンポーネント内の他の場所で使用できるためです。
これはまさに私があなたに感謝したことです。私は新しいコピーが返ってきたことを知っていました。 – Alex