async/await中Promise失效问题:Node.js控制台交互异常排查
Node.js异步执行顺序问题修复
你的问题核心是bumpDiff函数的异步逻辑没有正确用Promise包裹,导致await无法等待命令执行完成,直接走到了后续的readline提问。
问题根源
你标记了bumpDiff为async函数,但内部使用的是回调式的exec,既没有返回Promise,也没有在函数内等待异步操作完成。async函数如果没有await异步任务,会直接返回一个已完成的Promise,所以await bumpDiff()根本不会等exec执行结束就继续往下走,自然会先弹出提问,等exec跑完才输出差异内容。另外你之前的函数声明写法也有误,async function bumpDiff = () => {}应该改成const bumpDiff = async () => {}或者标准函数声明。
修复方案
有两种常用方式解决:
手动包裹Promise
把exec的回调逻辑包进Promise里,让await能正确等待:
const bumpDiff = () => { return new Promise((resolve, reject) => { exec('bump diff swagger.json newSwagger.json', (err, output) => { if (err) { console.error("could not execute command: ", err); reject(err); return; } console.log("Output:\n", output); resolve(output); }); }); };
使用util.promisify简化代码
Node.js的util模块提供了promisify方法,可以直接把回调风格的函数转成Promise形式,代码更简洁:
const { promisify } = require('util'); const exec = promisify(require('child_process').exec); const bumpDiff = async () => { try { const { stdout: output } = await exec('bump diff swagger.json newSwagger.json'); console.log("Output:\n", output); return output; } catch (err) { console.error("could not execute command: ", err); throw err; } };
修复后,await bumpDiff()会等待exec命令执行完毕、输出差异内容后,才会触发后续的readline提问,顺序就正常了。
内容的提问来源于stack exchange,提问作者B1sman
相关产品推荐
相关产品推荐

