JavaScript, node.js等待socket.在继续之前的回应



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

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

举个例子:

  1. 在套接字连接时调用socket.on(连接需要3秒,例如,客户端在Tor后面)。socket.on分配事件处理程序(这是它唯一做的事情,因为它以同样的方式为它拥有的11或更多事件工作)。
  2. 进入播放器。

但是点1并不需要3秒,因为它只是一个赋值——连接是需要3秒来建立的。在这个意义上,您有一个未定义的(实际上是:未分配的)变量。

所有这些操作都是异步的,所以最好尽量避免使用全局变量和有状态。

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

callback(current_player)

从那里,你可以把它放入一个全局可用的对象,你喜欢,例如,如果你正在使用Backbone或有一些东西在服务器端保持当前用户的跟踪。

最新更新