消息类和全局状态

时间:2014-03-06 23:03:12

标签: javascript messaging globals

这是一个前端项目,它使用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

上发布的

1 个答案:

答案 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;
});