这是一个前端项目,它使用socket.io进行与服务器的所有通信。这允许推送,但我们已被要求提供暂停按钮。暂停按钮旨在阻止数据在UI上更改,如果用户不希望它自动执行此操作。
我们有一个包装web-socket的类,并提供了很少的socket.io包装。
问题是,我们不能只关闭套接字。用户交互需要继续工作,不同的视图对于需要忽略哪些消息有不同的规范。
最终它是一个巨大的全球布尔。我宁愿不让它真正成为一个全局变量,所以这里有我迄今为止的想法:
全球
// A non pausable listener
socket.on('myEvent', function(data){
// do thing
});
// A pausable listener
socket.on('myPausable', function(data){
if(window.isPaused){ return false; }
// do thing
});
传递值
// A non pausable listener
socket.on('myEvent', function(data){
// do thing
});
// A pausable listener
socket.on('myPausable', function(data, isPaused){
if(isPaused){ return false; }
// do thing
});
包装方法
// A non pausable listener
socket.on('myEvent', function(data){
// do thing
});
// A pausable listener
socket.onLive('myPausable', function(data){
// do thing
});
单独的课程
// A non pausable listener
socket.on('myEvent', function(data){
// do thing
});
// A pausable listener
liveData.on('myPausable', function(data){
// do thing
});
目前在套接字上发生了大量的消息传递,并且UI上只有一个“PAUSE”切换,因此需要仔细完成。建议和最佳实践表示赞赏。
我最初是在'程序员'https://softwareengineering.stackexchange.com/questions/231524/messaging-class-and-global-state
上发布的答案 0 :(得分:1)
如何创建单独的UI模块,它独自负责UI上的所有更新。像这样:
var UI = {
paused: false,
exec: function(func){
if(!this.paused){
func();
}
}
}
liveData.on('myPausable', function(data){
UI.exec(function(){
// do stuff
});
});
pauseButton.click(function(){
UI.paused = true;
});