javascript - 在 socket.on 处理程序之外使用数据
问题描述
这可能是一个简单的答案,但我很难弄清楚。我想在 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
}
解决方案
你如何处理这件事有几个问题。
首先是范围问题。虽然全局并没有本质上不正确的地方,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 ) { .. }
。由于 JS 是从上到下执行的,而且 if 语句是在全局范围内的,所以在注册事件监听器后立即执行。这意味着您的 if 语句将始终失败。正如 klanmiko 提到的,您可以编写一个单独的函数来为您进行检查。
这是一个例子。关键区别在于分配给/data.id
的全局版本,而不是声明变量的本地版本并在每次分配后调用。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!
}
}
推荐阅读
- python - 使用 Shell 脚本时 Python 3 导入问题
- cross-origin-read-blocking - Grepper 代码扩展未显示建议并添加答案选项
- java - 如何在java中获取退回的邮件
- javascript - JS异步等待Node中的“无”?
- build - 如何在 Rust 中获取源代码的哈希值
- powershell - 使用变量作为目标文件夹名称的复制项问题
- python - Setup.py - 在 setuptools 中的包内添加数据文件
- python - 致命的 Python 错误:UBUNTU 18.04 LTS 服务器中的分段错误?
- python - 是否可以让模块在不同的模块中运行?
- node.js - 从 node_modules 绑定动态 Vue 图片 src