通过流程使用NodeJS全局事件是一个好主意吗?

时间:2016-04-25 12:47:00

标签: javascript node.js

我需要使用setInterval每隔N秒对数据库进行一次查询,并向所有Socket.IO客户端发送结果,所以我这样做:

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中的新手,我不知道有什么其他方法可以做到这一点......总的来说,我理解全球范围的使用不是最好的主意,但我不认识别人......

1 个答案:

答案 0 :(得分:1)

  • 如果您的真实代码在数量和复杂性方面相同或相似,则此方法不会产生任何问题。 Process对象是一个EventEmitter,在这里你可以有效地利用它。
  • 如果没有,最好使用自己的eventemitter而不是process对象。通过设计,它代表了运行节点过程的重要参数,例如执行环境,节点模块和其他OS抽象。 EventEmitter继承可帮助它管理流程生命周期事件。
  • 使用自定义应用程序数据流将其混乱不会导致任何功能问题,但是当应用程序增长时,维护和问题确定变得困难。例如,如果您碰巧在每个时间间隔存储“警报”(完全或其中一部分),则存储对象将无限增长,永远不会被垃圾收集。 ii)即使在完成与DB相关的活动之后,监听器也将继续处于活动状态,以及它所支持的任何内存。实际上,您可以通过命名回调函数(比如foo)来解决这个问题,并在不需要时通过发出process.removeListener('alarms_found',foo)来删除回调。