Electron中异步按钮调用异步函数失效问题求助
问题分析与修复方案
错误原因
DataReceived函数逻辑错误:Port.parser.on('data')是注册事件回调的方法,并非返回Promise的异步操作,await无法等待事件触发。这个函数会立即执行完毕并返回undefined,导致后续data变量为undefined,直接触发"too late"分支。- 点击事件逻辑混乱:
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
相关产品推荐
相关产品推荐

