2016-04-25 36 views
0

我需要使用setInterval做查詢數據庫中的每個N秒,消防結果所有Socket.IO客戶,所以我不喜歡這樣寫道:通過過程使用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與連接是一切正常。有單身人士。還有'if'語句確保'setInterval'函數只運行一次 – Kiril

回答

1
  • 如果你的真實代碼是相同的,或類似於數量和複雜性,這種方法不會帶來任何問題。過程對象是一個EventEmitter,在這裏你可以有效地利用它。
  • 如果不是,則使用您自己的平衡器而不是過程對象是一個好主意。通過設計,它代表了正在運行的節點進程的重要參數,如執行環境,節點模塊和其他操作系統抽象。 EventEmitter繼承有助於管理流程生命週期事件。
  • 使用自定義應用程序數據流將其混淆不會造成任何功能問題,但是當應用程序增長時,維護和問題確定變得困難。例如,如果您還碰巧在每個時間間隔存儲「警報」(完全或其子集),存儲對象將無限增長,永遠不會被垃圾收集。 ii)即使在完成與數據庫相關的活動後,聽衆仍會繼續處於活動狀態,同時還會保留任何記憶。在這種情況下,你可以通過命名回調函數(比如foo)來解決這個問題,並且在不需要的時候通過發出process.removeListener('alarms_found',foo)來移除回調。
相關問題