2016-10-08 13 views
0

私はjavascriptとES6が初めてです。 websocketオブジェクトをsubscribeに提供するコールバックにバインドするにはどうすればよいですか?私はこのような "グローバル"スコープからwebsocketオブジェクトにアクセスしているということは間違っている/嫌に思います。矢印機能を使用してコールバックにオブジェクトをバインドする

const URL = 'echo.websocket.org'; 
const websocket = new WebSocket(`wss://${URL}`); 
websocket.onmessage = (event)=>redux.dispatch(ChatActions.receiveMessage(event.data)); 
redux.subscribe(() => { 
    const { lastAction } = redux.getState(); 

    switch (lastAction.type) { 
    case ActionTypes.POST_MESSAGE: 
     return websocket.send(lastAction.text); 

    default: 
     return; 
    } 
}); 
+0

arrow関数は、 'this'オブジェクトを周囲の環境から取得します。 –

+0

たとえば、関数にパラメータとして渡すことができます。またはSingletoneを使用してWebsoketを取得することができます –

+0

@Nina Scholz詳しくは、この文脈では「this」の意味を教えてください。 2行目で作成されたwebsocketオブジェクトがスコープ外に出る場合、それは私の矢印関数でも未定義になります。もしそうなら、どうすればこのことを避けることができますか?言い換えれば、それを私の矢印の機能にどのように結び付けますか?私のコードはそのままですか? – Baz

答えて

1

あなたはおそらくclosureを使用したいと思うでしょう:

let webSocket = new WebSocket(url); 

let takesWebSocket = socket => { 
    return() => { 
    // do stuff with the websocket 
    }; 
}; 

let subscribeCallback = takesWebSocket(webSocket); 

redux.subscribe(subscribeCallback); 
1

それは私がこのような「グローバル」スコープからのWebSocketオブジェクトにアクセスしていますように私には間違った/奇妙に感じています。

いいえ、これはまさに正しい解決策です。矢印関数は、ローカルwebsocket変数にclosureを形成します。

websocket変数がグローバルである場合、これは別の問題です。その解決策はコールバックに影響しません。あなたは関数、IIFE、またはブロックですべてを包むことができます。

+0

私は上記のコードを(()=> {})();で囲む必要があります。そうすれば、websocketオブジェクトはグローバルスコープに追加されず、名前空間の汚染や他の誰かが私のWebSockオブジェクトを使用しようとする可能性を避けることになります。私は正しく理解していますか? – Baz

+0

@Bazはい、あなたはそれを行うことができます。しかし、あなたがES6モジュールを使用していると仮定すれば、あなたの変数はグローバルではないので、IIFEも必要ありません。 – Bergi

関連する問題