【问题标题】:Callback pattern implementation in javascript and encapsulationjavascript中的回调模式实现和封装
【发布时间】:2018-03-16 08:14:50
【问题描述】:

我正在编写这个应用程序,它变得非常混乱,因此我试图将程序的各个部分封装到模块中,但我发现了一些问题。

我有一个 SerialPortController 类,它处理串口,目前这个类只公开两个方法 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
  }
})();

【问题讨论】:

  • 显示一些代码,特别是描述您的问题的minimal reproducible example。
  • 添加了最少的代码。这一切都有效,但不是我想要的。每次收到数据时,我都需要将数据传递给 AppController。
  • 但它并不完整,也绝对无法验证。无论如何,All the methods I tried don't work and give me all sort of errors - 什么方法,什么错误。恐怕这里的人不是读心术。
  • 嗨,Jamiec,代码在我的机器上运行良好,如果它不符合您的标准,我们深表歉意。似乎至少其他一些人是读心者。

标签: javascript node.js encapsulation node-serialport


【解决方案1】:

为什么不在创建 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);
  };
  ...
  ...
  ...
}

【讨论】:

  • 嗨 Dushyant,这正是我要找的。我对回调概念感到非常困惑,以至于我把它弄得一团糟。这很简单。现在完美地工作。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多