javascript 中的回调模式实现和封装
Callback pattern implementation in javascript and encapsulation
我正在编写这个应用程序,它变得非常混乱,因此我试图将程序的各个部分封装到模块中,但我发现了一些问题。
我有一个 class SerialPortController,它处理串口,目前这个 class 只公开了两个方法 dataSend() 和 dataReceived()。
然后我有一个控制应用程序的模块,实现为 IIFE,在其中创建一个新的 serialPortController 对象。目前,每次在 serialport.on(data) 中调用接收到的数据时,我只是将数据打印到控制台。
在本地一切正常,AppController 创建新的 serialPortController 对象并且接收数据没问题,但我真正想要的是每次接收数据时在我的主 AppController 模块中触发一个函数。
我尝试过的所有方法都不起作用,并给我各种错误。主要与新对象对刚刚创建它的对象一无所知这一事实有关。
这需要某种回调模式,但我无法让它工作。这是否需要变成一个事件或类似的东西?
我确定这是一个常见问题,但我正在努力寻找有关如何实施它的任何信息。任何帮助将不胜感激。
这是我的代码的最小版本:
function SerialPortController(serialportSettings){
var portSettings = {
portName: "COM5",
baudRate: 115200,
stopBits: 1,
dataBits: 8,
parity: "none",
packetStart: '(',
packetEnd: ')'
};
//var data;
const SerialPort = require('serialport');
const DelimiterParser = SerialPort.parsers.Delimiter;
portSettings.portName = serialportSettings.portName;
portSettings.baudRate = serialportSettings.baudRate;
portSettings.stopBits = serialportSettings.stopBits;
portSettings.dataBits = serialportSettings.dataBits;
portSettings.parity = serialportSettings.parity;
portSettings.packetStart = serialportSettings.packetStart;
portSettings.packetEnd = serialportSettings.packetEnd;
const myPort = new SerialPort(portSettings.portName, {
baudRate: portSettings.baudRate,
stopBits: portSettings.stopBits,
dataBits: portSettings.dataBits,
parity: portSettings.parity
});
const delimiterParser = myPort.pipe(new DelimiterParser({delimiter: ')'}));
myPort.on('open', ()=>{
console.log("Serial Port is Open");
});
delimiterParser.on('data', (data)=>{
dataReceived(data);
//console.log(data.toString());
});
myPort.on('err', (err)=>{
console.log(err.message);
});
/* Just to expose data to the outside Modules */
var dataReceived = (data)=>{
console.log(data.toString());
};
/* writes data to the serial port. needs to report errors */
function sendData(data) {
myPort.write(data, onError);
};
return {
sendData: sendData,
dataReceived: dataReceived
};
};
var AppController = ((UICtrl)=>{
var portSettings = {
portName: "COM5",
baudRate: 115200,
stopBits: 1,
dataBits: 8,
parity: "none",
packetStart: '(',
packetEnd: ')'
}
var serialPortController = new SerialPortController(portSettings);
})(UIController);
var UIController =(()=>{
var writeDataToText = (data)=>{
var text1 = document.getElementById('text1');
text1.value = data;
};
return{
writeDataToText: writeDataToText
}
})();
为什么不在创建 SerialPortController 对象时提供简单的回调?
// Do this in your AppController:
var serialPortController = new SerialPortController(portSettings, function(data) {
console.log("data received:", data);
});
// Change your SerialPortController the following way:
function SerialPortController(serialportSettings, dataCallback) {
...
...
...
var dataReceived = data => {
console.log(data.toString());
dataCallback(data);
};
...
...
...
}
我正在编写这个应用程序,它变得非常混乱,因此我试图将程序的各个部分封装到模块中,但我发现了一些问题。
我有一个 class SerialPortController,它处理串口,目前这个 class 只公开了两个方法 dataSend() 和 dataReceived()。
然后我有一个控制应用程序的模块,实现为 IIFE,在其中创建一个新的 serialPortController 对象。目前,每次在 serialport.on(data) 中调用接收到的数据时,我只是将数据打印到控制台。
在本地一切正常,AppController 创建新的 serialPortController 对象并且接收数据没问题,但我真正想要的是每次接收数据时在我的主 AppController 模块中触发一个函数。 我尝试过的所有方法都不起作用,并给我各种错误。主要与新对象对刚刚创建它的对象一无所知这一事实有关。 这需要某种回调模式,但我无法让它工作。这是否需要变成一个事件或类似的东西?
我确定这是一个常见问题,但我正在努力寻找有关如何实施它的任何信息。任何帮助将不胜感激。
这是我的代码的最小版本:
function SerialPortController(serialportSettings){
var portSettings = {
portName: "COM5",
baudRate: 115200,
stopBits: 1,
dataBits: 8,
parity: "none",
packetStart: '(',
packetEnd: ')'
};
//var data;
const SerialPort = require('serialport');
const DelimiterParser = SerialPort.parsers.Delimiter;
portSettings.portName = serialportSettings.portName;
portSettings.baudRate = serialportSettings.baudRate;
portSettings.stopBits = serialportSettings.stopBits;
portSettings.dataBits = serialportSettings.dataBits;
portSettings.parity = serialportSettings.parity;
portSettings.packetStart = serialportSettings.packetStart;
portSettings.packetEnd = serialportSettings.packetEnd;
const myPort = new SerialPort(portSettings.portName, {
baudRate: portSettings.baudRate,
stopBits: portSettings.stopBits,
dataBits: portSettings.dataBits,
parity: portSettings.parity
});
const delimiterParser = myPort.pipe(new DelimiterParser({delimiter: ')'}));
myPort.on('open', ()=>{
console.log("Serial Port is Open");
});
delimiterParser.on('data', (data)=>{
dataReceived(data);
//console.log(data.toString());
});
myPort.on('err', (err)=>{
console.log(err.message);
});
/* Just to expose data to the outside Modules */
var dataReceived = (data)=>{
console.log(data.toString());
};
/* writes data to the serial port. needs to report errors */
function sendData(data) {
myPort.write(data, onError);
};
return {
sendData: sendData,
dataReceived: dataReceived
};
};
var AppController = ((UICtrl)=>{
var portSettings = {
portName: "COM5",
baudRate: 115200,
stopBits: 1,
dataBits: 8,
parity: "none",
packetStart: '(',
packetEnd: ')'
}
var serialPortController = new SerialPortController(portSettings);
})(UIController);
var UIController =(()=>{
var writeDataToText = (data)=>{
var text1 = document.getElementById('text1');
text1.value = data;
};
return{
writeDataToText: writeDataToText
}
})();
为什么不在创建 SerialPortController 对象时提供简单的回调?
// Do this in your AppController:
var serialPortController = new SerialPortController(portSettings, function(data) {
console.log("data received:", data);
});
// Change your SerialPortController the following way:
function SerialPortController(serialportSettings, dataCallback) {
...
...
...
var dataReceived = data => {
console.log(data.toString());
dataCallback(data);
};
...
...
...
}