首页 > 解决方案 > Node.js 中的自定义事件编程:I/O 绑定的面向事件的设计模式?

问题描述

我正在 node.js 中开发工厂自动化软件(图腾车门)。

该程序管理了一堆“任务”,例如它必须:

众所周知,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 事件处理程序中管理某种“无中断”逻辑。避免数据 R/W 重叠。为了避免在运行等时再次触发自定义事件等。

在我看来,我正面临着经典的多线程管理噩梦。

我的问题:

标签: node.jseventsioevent-handlingevent-driven-design

解决方案


推荐阅读