如何使用socket.io从服务器调用客户端方法
How to call a client side method from the server using socket.io
我使用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});
}
服务器不应尝试显式调用客户端上的任何函数客户端和服务器是不同的应用程序,它们通过请求相互"对话",但我认为让服务器知道客户端中函数的名称、客户端将如何处理响应或视觉界面如何工作是不好的做法。类似地,如果客户端知道特定于服务器的实现,并且告诉它要使用哪个数据库,那将是非常糟糕的。
这只是关注点的简单分离。另外,请阅读有关客户端-服务器域分离的信息。无论如何,我不知道你的具体应用程序,但让我们来看看一个实际的例子:
假设您的应用程序是堆栈溢出的修改版本。当用户对答案投赞成票时,服务器会收到通知,客户端应用程序必须在显示所有用户的页面上更改特定用户的栏的高度(根据新的点数)。。。
按照您今天的实现设计,这就是将要发生的事情:
服务器
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表示,而无需修改服务器。这有道理吗?
相关文章:
- SignalR 不从服务器调用客户端方法
- 调用客户端函数
- 在 SQL 依赖项更改后调用客户端函数
- 调用客户端 javascript/webpop 的表单的 DoS 风险/漏洞
- 如何先调用客户端脚本函数,然后再调用服务器端按钮单击事件
- 从asp.net c页面调用客户端javascript
- 在不打开新页面的情况下从浏览器调用客户端URL
- Signalr-连接已启动,但未使用websocket调用客户端事件
- 如何使用socket.io从服务器调用客户端方法
- Safari在服务器端的刷新/加载前不运行回调函数(调用客户端代码)
- ServiceNow UI操作调用客户端和服务器代码
- 服务器端函数调用客户端Javascript函数以获取结果
- JQuery-在Asp.Net中调用客户端的服务器端事件
- SignalR-Hub在IIS停止后,启动将不再调用客户端函数
- 会话属性在调用客户端重定向后丢失
- 客户端应该调用服务器还是服务器应该调用客户端?我错过了什么?
- 如何在NetSuite中调用客户端的PageInit函数
- 从c#页面方法调用客户端脚本(javascript,jquery等)
- 无法在OnDisconnected上调用客户端方法
- 从自定义方法调用客户端事件