JavaScript,node.js在继续之前等待socket.on响应

时间:2014-05-22 19:22:40

标签: javascript node.js sockets wait

我需要从客户端的服务器获取信息。 所以在服务器端,当客户端第一次连接时,我得到了这个:

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包装成$。什么时候完成,但它不起作用。我试图做一个回调,但我想我可能不太了解它应该如何工作。所以,如果你们中的一个愿意帮助我,我将不胜感激。

感谢您的回答。

3 个答案:

答案 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) - 不要等到事件发生,所以你必须异步思考。

举个例子:

  1. 在套接字连接时调用socket.on(连接需要3秒钟,例如,客户端在Tor后面)。 socket.on分配事件处理程序(它是唯一的事情,因为它适用于它拥有的11个或更多事件,以同样的方式)。
  2. 您可以访问该播放器。
  3. 但是点1不需要3秒,因为它只是一个任务 - 连接需要3秒才能建立。从这个意义上说,你有一个未定义的(实际上是:未分配的)变量。

答案 2 :(得分:0)

所有这些操作都是异步的,因此最好尽可能避免全局变量和状态。

那就是说,让你的回调将新创建的Player对象带到它需要去的地方 - 也许是一个玩家注册? - 并以这种方式运输。

callback(current_player)

从那里,您可以根据需要将其放入全局可用的对象中,例如,如果您使用的是Backbone,或者在服务器端有一些东西可以跟踪当前用户。