我想知道控制与某些事件监听器关联的逻辑是否处于事件状态的最佳方法。
我自然而然地遇到了三种控制事件监听器内部逻辑的方法。
- 使用一个可由所有连接的套接字访问的变量,充当看门人。如果一个套接字将该变量设置为 true,则所有套接字中的关联条件将允许运行其内部逻辑。类似地,如果一个套接字将该变量设置为 false,则任何套接字都无法调用监听器内的逻辑。情况 1 与其他两种情况的不同之处在于,所有事件监听器都会立即添加(并且永远不需要删除)。
- 通过迭代套接字数组向所有套接字添加(或删除)事件监听器。
- 使用应用事件(被动?)在所有套接字上添加(或删除)事件监听器。
(4.房间?我必须承认我根本没有使用过房间。但也许它们是一个适用的解决方案?)
<小时/>视觉示例
<小时/>这是一个通用示例:
index.js
var express = require('express');
var app = express();
var fs = require('fs');
var http = require('http').Server(app);
var ioRequire = require('socket.io');
var io = new ioRequire
io.attach(http);
startServingContent();
handleSocketEvents();
function startServingContent() {
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
var httpPort = 1337;
http.listen(httpPort, function(){
console.log('http server listening on ' + httpPort.toString());
});
}
var runEvent2Code = false;
function handleSocketEvents() {
io.on('connection', function(socket) {
logicGateExample();
function logicGateExample() {
socket.on('event1', function() {
runEvent2Code = true;
});
socket.on('event2', function() {
if (runEvent2Code) {
console.log('event2 logic just ran');
}
});
}
dynamicallyAddEventListenersViaIterationExample();
function dynamicallyAddEventListenersViaIterationExample() {
socket.on('event3', function() {
io.sockets.sockets.forEach(function(element, index, array) {
element.on('event4', function() {
console.log('event4 logic just ran');
});
});
});
}
dynamicallyAddEventListenersViaAppExample();
function dynamicallyAddEventListenersViaAppExample() {
socket.on('event5', function() {
app.emit('addEvent6 to all sockets');
});
app.on('addEvent6 to all sockets', function() {
socket.on('event6', function() {
console.log('event 6 logic just ran');
});
});
}
});
}
index.html
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io();
handleThisClientEmits();
function handleThisClientEmits() {
// Won't trigger event logic because the event logic isn't "active".
socket.emit('event2');
// Won't trigger event logic because the event logic isn't "active".
socket.emit('event4');
// Won't trigger event logic because the event logic isn't "active".
socket.emit('event6');
socket.emit('event1');
socket.emit('event2');
socket.emit('event3');
socket.emit('event4');
socket.emit('event5');
socket.emit('event6');
}
</script>
Node 命令提示符控制台输出:
event2 logic just ran
event4 logic just ran
event6 logic just ran
<小时/>
这是一个更具体的示例:
我有一个游戏,在用户登录并且特定用户开始游戏后,新的事件监听器需要处理控制游戏的逻辑。因此服务器注册了用户开始游戏的命令。它启动游戏逻辑并向客户端添加适当的事件监听器(或将适当的公共(public)变量设置为 true)。当游戏结束时,服务器删除适当的事件监听器(或将适当的公共(public)变量设置为 false)。添加和删除/激活和停用游戏逻辑可以防止被黑的客户端在游戏尚未开始时触发游戏事件,并帮助我在概念上将游戏与登录过程分开。
我再问一下,最好的方法是什么? 或者一致性很重要吗?如果最佳方法因上下文而异,那么我的游戏示例中的最佳方法是什么?其他方法有什么用?如果这些问题的答案纯属个人观点,我很抱歉!
使用应用程序事件以及套接字事件似乎很奇怪和尴尬。使用迭代向所有套接字添加事件监听器似乎更糟糕。但我记得有人告诉我,我的变量“看门人”方法并不反射(reflect) Node 和 socket.io 面向事件的性质。
(请参阅我的 previous question 对最后一句的澄清。我觉得这个新问题更好地表达了我的担忧以及我正在处理的具体问题。)
感谢您的帮助。我真的很感激!
请原谅我对术语的令人厌恶的了解和误用,以及我的缺乏简洁性。
最佳答案
第一,一个全局(或每个房间)状态变量,比尝试不断添加和删除事件处理程序更简单。此外,您可能不需要像您想象的那么多不同类型的事件。 Socket.io 客户端可以根据事件类型发送具有不同参数的消息。这样也可以让事情变得简单一些。
就防止客户作弊而言,这是一种完全不同的蠕虫病毒,如果您真的担心这一点,那么您可能需要花费大量时间来研究解决方案。
关于javascript - 管理事件监听器内部的逻辑; (我应该如何添加监听器?或者我应该使用条件 "gatekeeper"代替?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36366806/