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

Is it a good idea to use NodeJS global events via process?

本文关键字:好主意 事件 全局 进程 NodeJS      更新时间:2023-09-26

我需要使用 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的新手,我不知道任何其他方法可以做到这一点......总的来说,我知道使用全局范围不是最好的主意,但我不知道其他人......

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