web-dev-qa-db-ja.com

メッセージングクラスとグローバル状態

これは、サーバーとのすべての通信にsocket.ioを使用しているフロントエンドプロジェクトです。これにより、プッシュが可能になりますが、最近、一時停止ボタンを提供するように求められました。一時停止ボタンは、ユーザーが自動的に変更したくない場合に、UIでのデータの変更を停止することを目的としています。

現在、Webソケットをラップし、socket.ioのラップを最小限に抑えるクラスがあります。

問題は、ソケットをオフにするだけでは不十分なことです。ユーザーインタラクションは引き続き機能する必要があり、ビューが異なれば、無視する必要のあるメッセージに関する仕様も異なります。

どのようにスライスしても、最終的には大きなグローバルブール値になります。私はそれを本当にグローバル変数にしたくないので、これまでに私が持っていたアイデアは次のとおりです。


Narsty Global

  // 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の「一時停止」トグルは1つしかないため、これは慎重に行う必要があります。アドバイスとベストプラクティスを歓迎します。皆さんありがとう。

3
Fresheyeball

一時停止ボタンに関して認知的不協和があります-ユーザーとして、「一時停止」は「一時停止」を意味すると思います-サーバーが実行していることを停止します。ただし、要件からすると、サーバーはボタンの影響をまったく受けていないようです。これは、ユーザーへのフィードバックが実際に停止するため、混乱を招き、誤解を招く可能性があります。ほとんどの場合、「アニメーションの停止」と呼ばれるボタンまたは「自動更新」と呼ばれるトグルが、ユーザーにアイデアをよりよく伝える可能性があると思います。

当面の問題については、フラグを設定するというもう1つのアイデアを提案できますサーバー上これにより、一時停止したときに関連するメッセージがクライアントに完全に到達するのを防ぎます。このように、クライアントでの唯一の変更は、一時停止または一時停止解除するサーバーメッセージを追加することであり、残りは同じままです。

それがあなたの場合に意味をなさないのであれば、可動部品の数が最も少ないので、最も単純な解決策(醜いと思われますが)が最善であると私は信じています。グローバル状態変数を使用します(もちろん、適切な名前空間の下で-window.MyAmazingApp.isPaused)、他のコードはそのままにして、必要に応じて使用します。

3
Uri Agassi

更新の一時停止を解除するときは、最新の情報でUIを更新する必要があると思います。

これは、ソケットではなくUIで一時停止を発生させたいことを意味します。ソケットを自由に実行して、ローカル状態を更新します。 UIの場合、ローカル状態のコピーを表示に使用し、すべての一時停止を解除するまでコピーを更新しません。

0
BobDalgleish