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

0 javascript python websocket flask

我正在使用flask-socketio服务器,并具有以下代码从服务器调用客户端功能.这是正确的方法吗?或者,还有更好的方法

服务器

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

客户

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

小智 5

服务器永远不应该尝试显式调用客户端上的任何函数.客户端和服务器不同的应用程序,通过请求"交谈"对方,但我认为有一个知道的功能,在客户端,如何响应将通过客户端,或者如何在可视化界面来处理名称的服务器坏习惯作品.同样,如果客户端知道服务器特定的实现,并告诉它使用哪个数据库,那将是非常糟糕的.

这只是简单的关注点分离.另请阅读有关客户端 - 服务器域分离的信息.无论如何,我不知道你的具体应用,但让我们来看一个实际的例子:

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

按照今天的实现设计,这将是会发生的事情:

服务器

emit('new-points', {
     'data': 'IncreaseBarHeight',
     'parameter': '10px',
     'user': '3476'
})
Run Code Online (Sandbox Code Playgroud)

客户

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

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

这是一个更好的方法:

服务器

emit('new-points', {'points': 3560, 'user': '8376'})
Run Code Online (Sandbox Code Playgroud)

客户

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

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