これは、サーバーとのすべての通信に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つしかないため、これは慎重に行う必要があります。アドバイスとベストプラクティスを歓迎します。皆さんありがとう。
一時停止ボタンに関して認知的不協和があります-ユーザーとして、「一時停止」は「一時停止」を意味すると思います-サーバーが実行していることを停止します。ただし、要件からすると、サーバーはボタンの影響をまったく受けていないようです。これは、ユーザーへのフィードバックが実際に停止するため、混乱を招き、誤解を招く可能性があります。ほとんどの場合、「アニメーションの停止」と呼ばれるボタンまたは「自動更新」と呼ばれるトグルが、ユーザーにアイデアをよりよく伝える可能性があると思います。
当面の問題については、フラグを設定するというもう1つのアイデアを提案できますサーバー上これにより、一時停止したときに関連するメッセージがクライアントに完全に到達するのを防ぎます。このように、クライアントでの唯一の変更は、一時停止または一時停止解除するサーバーメッセージを追加することであり、残りは同じままです。
それがあなたの場合に意味をなさないのであれば、可動部品の数が最も少ないので、最も単純な解決策(醜いと思われますが)が最善であると私は信じています。グローバル状態変数を使用します(もちろん、適切な名前空間の下で-window.MyAmazingApp.isPaused
)、他のコードはそのままにして、必要に応じて使用します。
更新の一時停止を解除するときは、最新の情報でUIを更新する必要があると思います。
これは、ソケットではなくUIで一時停止を発生させたいことを意味します。ソケットを自由に実行して、ローカル状態を更新します。 UIの場合、ローカル状態のコピーを表示に使用し、すべての一時停止を解除するまでコピーを更新しません。