2016-04-19 31 views
1

これはおそらく非常に簡単ですが、私はJavascriptでプログラミングし、ソケットIOを使用することについてかなり新しいです。socket.on内の関数の値をグローバル変数に保存する方法は?

私はグローバル変数にプロセスが非常に単純である関数の中から値を与えたい:

var j; 

function a(){ 
j=2; 

} 
a(); 
//j is now 2 

私の問題は今、私は内部の機能を持っているsocket.onと呼ばれる方法を、持っていますこのようなことは、:

var j; 

socket.on('news', function (p) { 
j=p; 
//in here, j is equal to p 
}); 
//in here, j is NOT p, it is undefined. 

は今、このケースでは、私は私のグローバル変数jは、pの値を持つようにしたいが、私は、関数の外でJを印刷するとき、それは未定義です。これは、最初の例のように、関数の外にa();のようなものが必要なためです。 この場合、どうすればいいですか?

ありがとうございました。

答えて

1

socket.onの第2パラメータはいわゆるコールバック関数であり、JavaScriptの非常に一般的なパターンです。あなたの例では、あなたは '新しい'イベントを聞いています。このイベントが発生すると、コールバックは引数pで起動されます。もちろん、この引数はコールバック関数内でのみ使用できます。

明確にする:は、2番目の例の関数を直接呼び出します。 「ニュース」イベントが発生すると呼び出されます。

コールバックパターンは、非ブロッキングコードを書くことができるので、非常に便利です。 'ニュース'イベントが発生するのを待っている間に、socket.onコールの後のコードが正常に実行されています。これは、コールバック以外でpにアクセスできない理由です。コールバックがいつ呼び出されるかはわかりません。

Javascriptのevent loopまたはfunctions and their scopeについて少しお読みになりました。

+0

ありがとうございます。問題は、このコードの私の目標は、これらの 'p'の値を持つコールバック関数から受け取ったデータをグラフにプロットすることです。 グラフを作成して更新するには、これらの 'p'値が必要です。問題は、もし私がsocket.onの中にグラフを描画すると、私が望まない 'p'の値を得るたびにそのグラフの新しいコピーが得られるということです。 私の目標は、socket.onメソッドの外側でグラフを作成することです(グラフを一度しか作成しません)。socket.onから値を更新します。 –

+0

私はsocket.onの外で宣言する配列にこれらの 'p'点を保存しようとしましたが、配列がコールバック関数の外に受け取る値を保存しないと述べた理由から。これは私の問題です。 –

+0

このリンクから問題のコードを参照できます:http://stackoverflow.com/questions/36697138/drawing-a-d3-realtime-line-chart-inside-socket-on-socket-io –

関連する問題