【发布时间】:2022-01-03 00:32:04
【问题描述】:
我想将 socket.io 事件封装到函数中,使其对我的项目更具可读性,这是一个示例。我想把这个:
io.on('connection', (socket) =>{
//code
});
变成这样:
function isThereANewConnection() {
io.on('connection', (socket) =>{
//..return true?
});
}
function update() {
if(isThereANewConnection()) {
//do something with the socket data..
}
}
我似乎无法弄清楚如何实现这一点,因为我无法从函数中返回某些内容。有谁知道怎么做?
【问题讨论】:
-
这似乎是XY problem。这不是回调通常的工作方式。 “如果有新连接”的想法不是您在同步流中的条件中编码的东西,它是在回调触发时隐含地为真的东西。换句话说,只需将您的逻辑放在回调中,不需要
if。如果update必须知道回调中的信息,则回调可能会改变update函数在运行时可以读取的共享状态,但是如果没有更多上下文,很难推荐任何具体的内容。 -
您不需要将它们放在更新函数中,因为它们已经是事件侦听器。他们自己处理“更新”过程
-
您要在这里解决的真正问题是什么。您的服务器不应该想要阻止下一个连接。它应该为任何新连接到达时注册一个事件处理程序。如果您向我们展示您认为自己想要这样做的原因,那么我们可以更好地帮助您解决您的实际问题(可能不会按照您目前的方向发展,因为这不是您进行多用户事件驱动编程的方式)。
-
@jfriend00 是的,问题是我正在尝试制作一个面向对象的多人游戏,游戏本身就像玩家和输入类都是面向对象的。我正在考虑以这样一种方式设计我的服务器类,它也是 OOP,并在该特定类的更新方法中编写所有逻辑,就像游戏一样。但我认为我应该以不同的方式处理服务器架构?
-
将代码包装成函数本身并不是目的。一个函数至少必须接受并返回一个值,否则你只是在滥用它的接口。使用可组合的事件流(async/push)从 socket.io 事件中抽象出来更有意义。您可以将其实现为 Observable 或无状态的惰性 Promise(在 FP 术语中称为 Task)。
标签: javascript node.js oop socket.io functional-programming