如何从事件监听器退出父函数?

问题描述

我正在用NodeJS编写一个程序,该程序将与我的arduino通信。我正在使用serialport库。我已经编写了从端口发送和接收数据的功能

有一点背景知识,我已经创建了命令类型,并且在收到每个命令后都会发送一个确认。下面是我的receiveCommand函数

export const receiveCommand = (connection: any,command: any) => {
  const resData: any = [];
  return new Promise((resolve) => {
    const eListener = (packet: any) => {
      // console.log(packet)
      const data = xmodemDecode(packet);
      data.forEach((d) => {
        const { commandType,currentPacketNumber,totalPacket,dataChunk } = d;
        if (commandType === command) {
          resData[currentPacketNumber - 1] = dataChunk;
          const ackPacket = ackData(
            ACK_PACKET,`0x${currentPacketNumber.toString(16)}`
          );
          connection.write(Buffer.from(`aa${ackPacket}`,'hex'));
          if (currentPacketNumber === totalPacket) {
            resolve(resData.join(''));
            connection.removeListener('data',eListener);
          }
        }
      });
    };
    connection.on('data',eListener);
  });
};

现在,我用于给定任务的代码是这样的。

export const doTask = async (params) => {
  const { connection } = await createPort();
  connection.open();

  connection.on('close',(err)=>{
    if(err){
      console.log("error here");
      console.log(err);
    }
    return;
  })

    console.log(`Desktop : Sending Data .`);
    let commandNumber = 12
    let data = "abcd"
    await sendData(connection,commandNumber,data);

    commandNumber = 13
    const dataRec = await receiveCommand(connection,commandNumber)


    ...
    ...
    ...
    ...
    
  connection.close();
};

当我调用下面的函数时。

console.log("task starting");
await doTask();
console.log("task finished");

我的输出停止在connection.on('close')的回调中打印的错误处。它没有到达任务完成的最后一个console.log语句。我想了解如何从事件监听器正常退出函数doTask。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)