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