这可能是一个简单的答案,但是我很难弄清楚。我想使用来自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
}
答案 0 :(得分:1)
您将如何处理这个问题。
首先是范围问题。在函数内部playerId
中使用masterId
时,使用全局var playerId
和playerId
并没有固有的错误,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
第二个问题是master
和if ( 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
}
}