2014-03-06 80 views
0

这是一个使用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 
    }); 

目前有消息发生在插座的了很多,而且只会是一个“PAUSE '在用户界面上切换,所以这需要小心完成。建议和最佳实践表示赞赏。


我最初发布这个在“程序员” https://softwareengineering.stackexchange.com/questions/231524/messaging-class-and-global-state

回答

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; 
}); 
+0

+1帮助。问题是有一堆代码已经在使用套接字监听器,将所有代码移动到一个新模块似乎是不可行的。 – Fresheyeball

+0

UI模块与现有套接字代码完全分离。它只是一个全局单例,其他代码可以委派UI任务。 – levi

+0

我在下面添加的听众用于演示目的。作为“UI”模块可以全局访问,其他代码可以保留在现在的任何位置。 – levi