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
相关产品推荐
相关产品推荐

