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

Promise.then不触发:搜索打开COM串口后回调未执行问题求助

问题根因

Promise的状态一旦被resolve/reject触发就会永久凝固,不可修改。你当前的实现并行测试5个COM端口,只要任意一个端口打开失败,port.open的错误回调就会立即执行reject(error),直接将整个Promise标记为失败状态,后续哪怕有端口成功打开,对应的resolve调用也不会生效,自然无法触发then回调。
如果你的运行环境里序号靠前的COM口均不可用,第一个测试失败就会直接触发全局reject,没有机会走到可用端口的resolve逻辑。

修复方案

调整为逐个串行测试端口,找到第一个可正常打开的端口就resolve,全部端口测试失败才触发reject,修复后代码如下:

// 单个端口测试逻辑抽为独立Promise
function testComPort(index) {
  return new Promise((resolve, reject) => {
    const port = new SerialPort(`COM${index}`, {
      baudRate: 115200,
      autoOpen: false,
    });

    port.open((error) => {
      if (error) {
        console.log(error, "couldnt open port", index);
        return reject(error);
      }
    });

    port.on("open", () => {
      console.log("resolved port", index);
      return resolve(port);
    });
  });
}

// 串行遍历测试所有端口
async function getActiveComPort(maxPortNum = 5) {
  for (let index = 1; index <= maxPortNum; index++) {
    try {
      // 单个端口测试成功直接返回
      return await testComPort(index);
    } catch {
      // 单端口测试失败,跳过测试下一个
      continue;
    }
  }
  // 所有端口均不可用抛出错误
  throw new Error("未检测到可用COM端口");
}

// 调用逻辑
getActiveComPort()
  .then((port) => {
    console.log("comport _______________");
    console.log("comport", port);
    port.write(`X002B[290005]\r\n`);
  })
  .catch((error) => {
    console.log(error);
  });
补充说明

如果需要同时测试多个端口并返回所有可用端口,可以用Promise.allSettled过滤出成功的结果即可,不需要串行遍历。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:09:03