Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过进程使用NodeJS全局事件是一个好主意吗?_Javascript_Node.js - Fatal编程技术网

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

Javascript 通过进程使用NodeJS全局事件是一个好主意吗?,javascript,node.js,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(funct

我需要使用
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,在这里您可以有效地利用它
  • 如果不是,最好使用自己的eventemitter,而不是process对象。通过设计,它表示运行节点进程的重要参数,如执行环境、节点模块和其他操作系统抽象。EventEmitter继承有助于管理流程生命周期事件
  • 将其与自定义应用程序数据流混为一谈不会导致任何功能问题,但当应用程序增长时,维护和问题确定变得困难。例如,如果您还碰巧每隔一段时间存储“报警”(全部或其子集),则存储对象将无限增长,并且永远不可垃圾回收。ii)即使您完成了与数据库相关的活动,侦听器仍将保持活动状态,并保留所有内存。在这种情况下,您可以通过命名回调函数(比如foo)来解决这个问题,并在不需要时通过发出process.removeListener('alarms_found',foo')来删除回调

看起来好像要查询数据库中的每个连接。这可能不是一个好主意。最好在某个地方注册新连接,查询数据库一次,然后将结果发送到每个连接。@DanielDiekmeier with connection就可以了。还有单身汉。还有
if
语句确保
setInterval
函数只运行一次