2016-04-19 37 views
1

這可能很簡單,但我對JavaScript編程和使用Socket 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的第二個參數是一個所謂的回調函數,這是一個非常常見的javascript模式。在你的例子中,你正在聽'新'事件。發生此事件時,將使用參數p觸發回調。當然這個參數只在回調函數本身內部可用。

要清楚:你做不是直接調用第二個例子中的函數。一旦發生'新聞'事件就會被調用。

回調模式非常方便,因爲它允許您編寫非阻塞代碼。在等待「新聞」事件發生時,您的socket.on調用之後的任何代碼正在正常執行。這就是爲什麼您不能在回調之外訪問p的原因:您不知道回調將在什麼時間點被調用。

我想你讀了一點關於Javascript的event loopfunctions and their scope

+0

謝謝你的回答。問題是我的這個代碼的目標是用我從回調函數接收到的數據繪製一個圖,並帶有這些'p'值。 現在,爲了創建和更新圖形,我需要這些不斷出現的「p」值。問題是,如果我在socket.on中繪製圖表,每當我得到一個'p'值時,我就會得到該圖的新副本,這是我不想要的。 所以我的目標是在socket.on方法之外創建圖(它只創建一次圖),同時更新socket.on中的值。 –

+0

我試着將這些'p'點保存到一個數組中,我在socket.on之外聲明瞭這個數組,但是由於你聲明的原因,數組並沒有保存它接收到的回調函數之外的任何值。這是我的問題。 –

+0

您可以參考此鏈接的代碼有問題:http://stackoverflow.com/questions/36697138/drawing-a-d3-realtime-line-chart-inside-socket-on-socket-io –

相關問題