如何使用await调用readline.question方法实现指定交互式输入
解决Node.js中使用await配合readline.question的问题
要让代码支持await并满足输入隐藏的要求,核心是把回调式的readline.question封装为Promise,再通过async/await实现顺序执行。以下是修改后的完整代码:
const readline = require('readline'); const { Writable } = require('stream'); // 创建可控制输出显示的自定义流 const mutableStdout = new Writable({ write(chunk, encoding, callback) { if (!this.muted) { process.stdout.write(chunk, encoding); } callback(); } }); // 初始化readline交互接口 const rl = readline.createInterface({ input: process.stdin, output: mutableStdout, terminal: true }); // 将readline.question封装为Promise,支持await调用 const askQuestion = (prompt, muteOutput = false) => { return new Promise(resolve => { mutableStdout.muted = muteOutput; rl.question(prompt, answer => { resolve(answer); }); }); }; // 主逻辑通过自执行async函数实现顺序输入 (async () => { try { // 输入Amount,不隐藏输入内容 const amount = await askQuestion('Amount: ', false); console.log('\nAmount is ' + amount); // 输入Secret,隐藏输入内容 const secret = await askQuestion('Secret: ', true); console.log('\nSecret is ' + secret); } finally { // 执行完成后关闭readline接口,避免程序挂起 rl.close(); } })();
关键修改说明:
- Promise封装:自定义
askQuestion函数把rl.question的回调逻辑转为Promise,这样就能用await等待输入完成。 - 顺序执行:通过
await确保第一个输入完成后再执行第二个,避免原代码中两个输入并行导致的混乱。 - 输出控制:在
askQuestion中根据传入的参数动态设置mutableStdout.muted,满足Amount显示输入、Secret隐藏输入的要求。 - 资源清理:用
finally块保证无论输入过程是否出错,都会关闭readline接口,防止程序一直挂起。
直接运行node mycode.js即可在控制台按顺序输入Amount和Secret,输入Secret时内容会被隐藏。
内容的提问来源于stack exchange,提问作者Alexey Starinsky
相关产品推荐
相关产品推荐

