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

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

最佳答案

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

关于javascript - 通过进程使用 NodeJS 全局事件是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36841043/

相关文章:

javascript - 用于 XMLHttpRequest 或 ActiveXObject 的 JavaScript 中 jQuery 的 .ajaxComplete() 替代方案

javascript - 表单的 get 方法与 Angular $http.get 请求

arrays - Angular 2 - 从嵌套数组创建 CSV 文件

node.js - 通过 Node 将浏览器麦克风流连接到 Google Speech Api

javascript - 我想在 this.props.onChange 中保存两个值,但只保存最后一个

javascript - 历史记录恢复后,Knockout 绑定(bind)将解除绑定(bind)

javascript - OpenLayers 3 在不向 map 添加图层的情况下获取矢量特征/属性

javascript - 当 mouseenter 触发时,在 <object> 标记内的选定 SVG 中添加属性

javascript - testcafe 基于浏览器运行不同的测试

node.js - Windows 上的 Cordova inAppBrowser 插件问题