[英]JavaScript, node.js wait for socket.on response before continuing
我需要從客戶端的服務器獲取信息。 所以在服務器端,我在客戶端第一次連接時得到了這個:
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不會等待我的套接字在繼續之前檢索數據。
我嘗試將socket.on包裝在$ .when中,但它不起作用。 我試圖做一個回調,但我想我可能不太了解它應該如何工作。 所以,如果你們中的一個願意幫助我,我將不勝感激
謝謝您的回答。
如果你將current_player
變量放在on
回調之外試圖return
它,另一種方法是讓你自己的函數接收回調
function getPlayer(onDone){
socket.on('confirmauth', function(id, username, num, callback) {
var current_player = new Player(username,id, num);
onDone(current_player);
});
}
而不是做
var player = getPlayer();
//...
你做
getPlayer(function(player){
//...
});
有點糟糕的是,“回調”在Javascript中有點傳染性,但這種生活直到每個人都開始使用生成器。
這是因為socket.on
運行回調,並且在回調中設置了播放器。 但是,在調用socket.on
你嘗試讀取播放器,但是沒有設置,因為沒有調用回調。 記住你正在處理異步編程。 嘗試使用nibble
在回調后鏈接該代碼。
記住: socket.on
和許多其他套接字處理程序 - 甚至許多其他事件句柄(例如jquery) - 不要等到事件發生,所以你必須異步思考。
舉個例子:
socket.on
(連接需要3秒鍾,例如,客戶端在Tor后面)。 socket.on
分配事件處理程序(它是唯一的事情,因為它適用於它擁有的11個或更多事件,以同樣的方式)。 但是點1不需要3秒,因為它只是一個任務 - 連接需要3秒才能建立。 從這個意義上說,你有一個未定義的(實際上是:未分配的)變量。
所有這些操作都是異步的,因此最好盡可能避免全局變量和有狀態。
那就是說,讓你的回調將新創建的Player對象帶到它需要去的地方 - 也許是一個玩家注冊? - 並以這種方式運輸。
callback(current_player)
從那里,您可以根據需要將其放入全局可用對象中,例如,如果您正在使用Backbone或在服務器端有一些東西跟蹤當前用戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.