我需要从客户端服务器获取信息。所以在服务器端,当客户端第一次连接时,我得到了这个:
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不等待我的套接字上检索数据之前进行。
我试图包装套接字。在一个$。当完成时,但它不起作用。我试着做一个回调,但我想我可能不太明白它应该是如何工作的。所以如果你们中有人愿意帮助我,我会很感激的。
谢谢你的回答。
如果您将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中"callbackyness"有点传染性,这有点糟糕,但这就是生活,直到每个人都开始使用generator来代替。
这是因为socket.on
运行回调,并且在播放器设置的回调中。然而,在调用socket.on
之后,您尝试读取播放器,但它没有设置,因为没有调用回调。记住,您正在处理异步编程。尝试使用nibble
在回调之后链接代码。
请记住:socket.on
和许多其他套接字处理程序-甚至许多其他事件处理程序(例如jquery)-不要等待事件发生,所以你必须异步思考。
举个例子:
- 在套接字连接时调用
socket.on
(连接需要3秒,例如,客户端在Tor后面)。socket.on
分配事件处理程序(这是它唯一做的事情,因为它以同样的方式为它拥有的11或更多事件工作)。 - 进入播放器。
但是点1并不需要3秒,因为它只是一个赋值——连接是需要3秒来建立的。在这个意义上,您有一个未定义的(实际上是:未分配的)变量。
所有这些操作都是异步的,所以最好尽量避免使用全局变量和有状态。
也就是说,让你的回调把新创建的Player对象带到它需要去的地方——一个玩家注册表,也许?-并以这种方式传输。
callback(current_player)
从那里,你可以把它放入一个全局可用的对象,你喜欢,例如,如果你正在使用Backbone或有一些东西在服务器端保持当前用户的跟踪。