You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron中异步按钮调用异步函数失效问题求助

问题分析与修复方案

错误原因

  1. DataReceived函数逻辑错误:Port.parser.on('data')是注册事件回调的方法,并非返回Promise的异步操作,await无法等待事件触发。这个函数会立即执行完毕并返回undefined,导致后续data变量为undefined,直接触发"too late"分支。
  2. 点击事件逻辑混乱:await与.then混用导致变量作用域出错,data无法正确获取DataReceived的返回值。

修复后的代码

首先重写DataReceived,让它返回一个Promise来等待串口数据:

function DataReceived() {
  // 返回Promise,当接收到一次数据后resolve结果
  return new Promise((resolve) => {
    // 使用once而非on,避免重复绑定事件,每次调用只监听一次数据
    Port.parser.once('data', (data) => {
      resolve(data);
    });
  });
}

然后修复按钮点击事件的逻辑:

table.send.onclick = async () => {
  try {
    const data = await DataReceived();
    // 将二进制/Buffer数据转为字符串并去除首尾空白,避免格式干扰判断
    const dataStr = data.toString().trim();
    if (dataStr !== "") {
      console.log(dataStr);
    } else {
      console.log("数据为空");
    }
  } catch (err) {
    console.error("接收数据失败:", err);
  }
};

补充说明

  • 使用once替代on,确保每次点击按钮只监听一次串口数据,避免多次绑定导致重复触发。
  • 加入try/catch捕获可能的异常(比如串口连接中断等情况)。
  • 将接收到的原始数据转为字符串并去除空白,避免因串口返回的换行、空格导致误判为空。

内容的提问来源于stack exchange,提问作者johnny blue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:20:23