2016-04-25 2 views
0

私はこのようにそれを行うように、すべてのSocket.IOクライアントにデータベースに各N秒と火災の結果をクエリを行うためにsetIntervalを使用する必要があります。Process経由でNodeJSグローバルイベントを使用することをお勧めしますか?

let interval_id = null 

io.on('connection', function(socket) { 
    if (interval_id == null) { 

     interval_id = setInterval(function() { 
      db.table.items.getAll().then(function(items) { 
       process.emit('items_found', items) 
      }).catch(function(err) { 
       log.error(err) 
      }) 
     }, config.scan.interval) 
    } 

    process.on('alarms_found', function(alarms) { 
     console.log(alarms.length) 
    }) 
}) 

「これは正常に動作していますが、私はNodeJSで初心者だと私はドンこれを行うための他の方法はわかりません...一般的に私はグローバルスコープの使用法がベストアイデアではないことを理解していますが、私は他のものを知らない...

+0

接続ごとにデータベースを照会するかのように見えます。これはおそらく良い考えではありません。新しい接続をどこかに登録し、データベースに一度問い合わせて、すべての接続に結果を送信する方がよいでしょう。 –

+0

@DanielDiekmeierと接続しても問題ありません。シングルトンがあります。また、 'setInterval'関数が1回だけ実行されることを保証する' if'ステートメントがあります – Kiril

答えて

1
  • 実際のコードが同じ量および複雑さに関して同様であるが、このアプローチはいかなる問題も課さない。プロセスオブジェクトはEventEmitterであり、ここで効果的に活用します。
  • もしそうでなければ、processオブジェクトの代わりにあなた自身のイベントエミッタを使用することをお勧めします。設計上、実行環境、ノードモジュール、その他のOS抽象化など、実行中のノードプロセスの重要なパラメータを表します。 EventEmitterの継承は、プロセスライフサイクルイベントの管理に役立ちます。
  • カスタム・アプリケーション・データ・フローでクラッタリングしても問題は発生しませんが、アプリケーションが大きくなるとメンテナンスや問題判別が難しくなります。たとえば、すべての間隔で「アラーム」(完全に、またはそのサブセットのいずれか)を格納すると、格納オブジェクトは無期限に増加し、ゴミ収集可能にならないことがあります。 ii)DB関連のアクティビティが終了した後でも、リスナは、それが保持していたメモリとともに、引き続きアクティブになります。このシナリオでは、実際にはコールバック関数(fooなど)の名前を付けて処理し、不要な場合はprocess.removeListener( 'alarms_found'、foo)を発行してコールバックを削除できます。
関連する問題