繁体   English   中英

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

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

举个例子:

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

但是点1不需要3秒,因为它只是一个任务 - 连接需要3秒才能建立。 从这个意义上说,你有一个未定义的(实际上是:未分配的)变量。

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

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

callback(current_player)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM