gpt4 book ai didi

javascript - 如何使用 socket.io 从服务器调用客户端方法

转载 作者:行者123 更新时间:2023-11-28 13:29:13 24 4
gpt4 key购买 nike

我正在使用flask-socketio作为服务器,并使用以下代码从服务器调用客户端函数。这是正确的方法吗?或者有更好的办法

服务器

@socketio.on('connect', namespace='/test')
def test_connect():
sleep(5)
emit('my response', {'data': 'myFunction', 'parameter': 2})

客户端

socket.on('my response', function(msg) {
console.log(msg)
window[msg.data]({parameter1 : msg.parameter});
}

最佳答案

服务器永远不应该尝试显式调用客户端上的任何函数。客户端和服务器是不同的应用程序,它们通过请求相互“交谈”,但我认为拥有这样的服务器是不好的做法知道客户端中函数的名称、客户端将如何处理响应或可视界面如何工作。同样,如果客户端知道服务器特定的实现,并告诉它要使用哪个数据库,那将非常糟糕。

这很简单separation of concerns 。另外,请阅读有关客户端-服务器域分离的信息。不管怎样,我不知道你的具体应用,但是让我们来看一个实际的例子:

假设您的应用程序是堆栈溢出的修改版本。当用户对答案进行投票时,服务器会收到通知,并且客户端应用程序必须在显示所有用户的页面上更改该特定用户的栏的高度(根据新的点数)...

按照您今天的实现设计方式,将会发生以下情况:

服务器

emit('new-points', {
'data': 'IncreaseBarHeight',
'parameter': '10px',
'user': '3476'
})

客户端

socket.on('new-points', function(msg) {
window[msg.data]({height : msg.parameter});
//this would trigger global IncreaseBarHeight('10px', msg.user)
}

因此,客户端对界面有一些了解,它知道 UI 中有一个栏并且应该增加高度。如果我决定更改 UI 并且只有数字而不是条形,我还必须重新实现服务器。他们太耦合了。

这是一个更好的方法:

服务器

emit('new-points', {'points': 3560, 'user': '8376'})

客户端

socket.on('new-points', function(msg) {
SetBarHeight(msg.points, msg.user); //set height based on total points
}

服务器不知道客户端将如何使用该信息,因此它们不耦合。我可以更改点的 UI 表示,而无需修改服务器。有道理吗?

关于javascript - 如何使用 socket.io 从服务器调用客户端方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26438814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com