在socket.on处理程序之外使用数据

时间:2018-12-04 21:32:19

标签: javascript node.js socket.io

这可能是一个简单的答案,但是我很难弄清楚。我想使用来自socket.on之外的这些套接字中的数据来比较它们,以便执行某些操作。我试过使用全局变量没有运气。我本来打算将它们分组,但是“ master”是一个io.emit,而id是一个socket.emit。

var playerId;
var masterId;

// Player socket.id
socket.on('id', function(data){
    console.log(data.id);
    var playerId = data.id;
});

// // Master socket.id
socket.on('master', function(data){
    console.log(data.master + ' is the master');
    var masterId = data.master;
});

if (playerId == masterId){
    // do something
}

2 个答案:

答案 0 :(得分:1)

您将如何处理这个问题。

首先是范围问题。在函数内部playerId中使用masterId时,使用全局var playerIdplayerId并没有固有的错误,var playerId = 2; function scoped(data) { var playerId = data.id; console.log(`${playerId} from the func. scoped`); } scoped({ id: 4 }); console.log(`${playerId} from global scope`);的作用域仅限于该函数,而无论其名称如何。例如:

body {
  margin: 0;
}

.as-console-wrapper {
  height: 100%;
  max-height: initial !important;
}
id

第二个问题是masterif ( playerId == masterId ) { .. }都是事件。您的程序不会在何时,何时触发。没什么大不了的,除非您在事件监听器之后尝试将它们与data.id进行比较。由于JS从上到下执行,并且if语句在全局范围内,因此在注册事件侦听器后立即执行。这意味着您的if语句将始终失败。正如klanmiko所说,您可以编写一个单独的函数来为您进行检查。

这里是一个例子。主要区别在于将playerId分配给masterId / checkId()的全局版本,而不是声明变量的本地版本并在每次分配后调用var playerId = null; var masterId = null; socket.on('id', function(data) { playerId = data.id; // Assigns the global playerId = data.id; checkId(); }); socket.on('master', function(data) { masterId = data.id; // Assigns the global masterId = data.id; checkId(); }); function checkId() { if ( playerId == masterId ) { // Do something cool! } }

shutdown

答案 1 :(得分:0)

通常,除非将消息传递给在其他地方运行的另一个循环,或者从socket.on调用另一个函数,否则您通常需要在该socket.on中做所有想做的事情。

您似乎正在尝试同步两个事件,在收到两个事件之后,您想比较playerId == masterId

var playerId = null;
var masterId = null;

// Player socket.id
socket.on('id', function(data){
    console.log(data.id);
    var playerId = data.id;
    checkId();
});

// // Master socket.id
socket.on('master', function(data){
    console.log(data.master + ' is the master');
    var masterId = data.master;
    checkId();
});

function checkId() {
    if (playerId && masterId 
        && playerId == masterId) {
        // do something
    }
}