2014-05-22 126 views
3

我需要從客戶端的服務器獲取信息。 所以在服務器端,我得到這個當客戶第一次連接:JavaScript,node.js在繼續之前等待socket.on響應

socket.on('adduser', function(username){ 
    // misc code, where i set num_player and whatnot 
    socket.emit('confirmauth', socket.id, socket.num_player, function(data){ 
     console.log(data) 
    }); 
    // code 
} 

,並在客戶端上我得到了這個:

var current_player; 
socket.on('confirmauth', function(id, username, num, callback) { 

    current_player = new Player(username,id, num); 

    console.log(current_player.id); // works 
    console.log(current_player.num); //works 
    callback('ok i got it'); 
}); 

console.log(current_player.id); //undefined 
console.log(current_player.num); //undefined 

我的問題是,玩家插座的那個之外沒有定義。看來,JavaScript不會等待我的套接字在繼續之前檢索數據。

我試圖在$ .when中完成封裝socket.on,但它不起作用。我試圖做一個回調,但我想我可能不太清楚它應該如何工作。所以如果你們中的一個願意幫助我,我將不勝感激

謝謝你的回答。

回答

4

如果你把current_player變量on回調之外,企圖return它,另一種方法是使自己的功能接收並做

var player = getPlayer(); 
//... 
代替

function getPlayer(onDone){ 
    socket.on('confirmauth', function(id, username, num, callback) { 
     var current_player = new Player(username,id, num); 
     onDone(current_player); 
    }); 
} 

回調

你做

getPlayer(function(player){ 
    //... 
}); 

這種「回調」在Javascript中有些傳染性,但是直到每個人都開始使用「發生器」,它纔是生命。

+0

這就是爲什麼nodejs需要半字節 –

+0

@LuisMasuelli:我找不到任何關於節點的「半字節」庫。如果你的意思是「敏捷」,那不是我想到的,因爲它仍然強迫你使用庫而不是現有的JS特性,如while循環或try-catch來控制流。請參閱[this](http://stackoverflow.com/questions/9432587/what-is-the-correct-way-to-chain-async-calls-in-javascript/9432771#9432771)。 – hugomg

+0

也許錯了名字。讓我再看一遍... - 是的,你說得對。它反正很糟糕,但它是異步編程 –

0

這是因爲socket.on運行回調,並在設置播放器的回調。但是,在致電socket.on後,您嘗試閱讀播放器,但未設置,因爲未調用回調。記住你正在處理異步編程。嘗試使用nibble在回調後鏈接該代碼。

記住:socket.on和許多其他的套接字處理程序 - 甚至許多其他事件句柄(例如jquery) - 不要等待事件發生,所以你必須思考異步。

藉此例如:

  1. 你打電話socket.on而插座連接(該連接需要3秒因爲,例如,在客戶端是後面TOR)。 socket.on分配事件處理程序(它是唯一的事件處理程序,因爲它對11個或更多事件具有同樣的作用)。
  2. 您訪問該播放器。

但點1不需要3秒,因爲它只是一個任務 - 連接需要3秒鐘才能建立。從這個意義上講,你有一個未定義的(實際上:未分配的)變量。

0

所有這些操作都是異步的,所以最好儘可能地避免全局變量和狀態。

也就是說,你的回調是否將新創建的Player對象帶到了它需要去的地方 - 可能是玩家的註冊表? - 並以這種方式運輸。

callback(current_player) 

從那裏,你,如果你正在使用的骨幹或有現有用戶的服務器端保持跟蹤的東西可以把它變成一個全球可用的對象,只要你喜歡,例如。

相關問題