2016-05-01 5 views
0

私は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 } ] 

は可能ですグローバルな可変状態の使用に固執する必要がありますか?私がこの質問をする唯一の理由は、過去に反応を使用したときに、メソッド内のコンポーネント状態を更新し、その新しい状態をコンポーネント内の他の場所で使用できるためです。

答えて

2

あなたのコードには簡単な割り当てがありません。不変を使用している場合は、setのような更新操作によって、新しいオブジェクトが作成されます。あなたのケースでは、次のコードstate.set("clients", clientsArray)はグローバル状態を変更しませんが、変更されたclientsリストを持つ新しいインスタンスを返します。 はこれを修正するには、単にのようなので、呼び出しの結果、とのグローバルな状態を更新する必要があります -

state = state.set("clients", clientsArray);

それとも、すべて一発でこれを書き換えることができ -

state = state.set("clients", state.get("clients").push(socket));

これが役立つことを願っています!

大まかには、不変のメソッドを変更/変更するメソッドを呼び出すときは、常に割り当てを行う必要があることに注意してください。

+0

これはまさに私があなたに感謝したことです。私は新しいコピーが返ってきたことを知っていました。 – Alex

関連する問題