问题描述
我正在node.js中开发工厂自动化软件(图腾车门)。
程序可以管理很多“任务”,例如,它必须:
- 监视和控制一些I / O数字信号
- 管理来自外部主机的消息,例如通过TCP套接字消息
- 通过HTTP REST轮询其他设备(我需要将轮询转换为事件)
- 通过键盘(和屏幕终端/语音输出)与用户交互
- 在外部服务器上查询关系数据库
- 等
通常,node.js是管理(I / O)事件的理想环境,我知道我可以使用EventEmitter
类生成自定义事件的事实。
对于以上所有详细的任务,请假设:
因此,我可以将主程序设计为事件驱动的,将应用程序逻辑实现为SW事件(Node.js习惯事件)的回调,并将它们与I / O(HW)事件映射。
// -----------------------------
// module A: keyboard management
// -----------------------------
// when user enter 5 digits (code) on the keypad keystroke (code omitted),// emit the SW event 'digitsEntered'
keyBoardDialog.emit('digitsEntered',code)
// ----------------------------------------
// module B: I/O digital signals management
// ----------------------------------------
// poll (every ~300 msecs) through HTTP GET
// to get a buffer containing all digital input bits
// and when the digital input 1 goes ON,emit SW event,'DI1ON' (code omitted)
digitalInputs.emit('DI1ON')
// -----------
// main module
// -----------
// all events handler
keyBoardDialog.on ('digitsEntered',(code) => doActionWithDigits(code) )
digitalInputs.on ('DI1ON',doAnotherAction() )
function doActionWithDigits(code) {
writeOnDatabase(code) // asynch
writeDigitalOutput(4) // HTTP GET = asynch
// any other synch or asynch function
}
自定义事件回调(处理程序)可能包含顺序和/或异步(异步)功能。
通过示例,我们重点研究从键盘读取按键的任务。
用户必须输入5位数字,并且键盘模块逻辑会触发自定义事件('digitsEntered'
)。
doActionWithDigits()
处理程序包含异步函数。
这里可能会出现计时/数据共享问题。
因为基于事件的单线程体系结构,所以我必须在自定义e事件处理程序中管理“无中断”逻辑。为了避免数据读/写重叠。为了避免在运行等事件时再次触发该自定义事件,等等。
在我看来,我正面临着经典的多线程管理噩梦。
我的问题:
- 关于如何在类似情况下管理自定义事件处理程序,有什么好的做法/指南?
- 使用自定义事件而不是Node.js回调的真正优势是什么? 全部都是去耦逻辑吗?
- 您是否可以提出一些有关设计模式良好实践的文章(书/书)?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)