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

Javascript 在socket.on处理程序外部使用数据,javascript,node.js,socket.io,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

这可能是一个简单的答案,但我很难弄明白。我想使用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
}

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

似乎您正在尝试同步这两个事件,在您收到这两个事件后,您希望比较if
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
    }
}

有几个问题你是如何处理的

首先是范围问题。当您在函数内使用
var playerId
时,全局
playerId
masterId
没有本质上的错误
playerId
成为该函数的作用域,而不管其名称是否相同。例如:

var playerId=2;
函数作用域(数据){
var playerId=data.id;
log(`func.scoped`中的${playerId});
}
范围({
身份证号码:4
});
log(`global scope`${playerId})
正文{
保证金:0;
}
.作为控制台包装{
身高:100%;
最大高度:初始!重要;
}