我需要使用 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
的新手,我不知道有任何其他方法可以做到这一点......总的来说,我知道使用全局范围不是最好的主意,但我不知道其他......
最佳答案
- 如果您的实际代码相同或在数量和复杂性方面相似,则此方法不会产生任何问题。 Process 对象是一个 EventEmitter,在这里您可以有效地利用它。
- 如果没有,最好使用您自己的事件发射器,而不是进程对象。根据设计,它代表运行 Node 进程的重要参数,例如执行环境、 Node 模块和其他操作系统抽象。 EventEmitter 继承有助于它管理流程生命周期事件。
- 将其与自定义应用程序数据流混在一起不会导致任何功能问题,但当应用程序增长时,维护和问题确定会变得困难。例如,如果您碰巧在每个时间间隔存储“警报”(整个警报或警报的子集),则存储对象将无限期增长并且永远不会被垃圾收集。 ii) 即使您完成了与数据库相关的事件,监听器及其保留的任何内存也将继续处于事件状态。在这种情况下,您实际上可以通过命名回调函数(例如 foo)来解决这个问题,并在不需要时通过发出 process.removeListener('alarms_found', foo) 来删除回调。
关于javascript - 通过进程使用 NodeJS 全局事件是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36841043/