如何在Async Function与Readline结合时实现异步等待输入后执行后续逻辑?
解决Readline异步操作与Promise链同步的问题
嘿,我明白你遇到的问题了——你想让Promise链等用户通过readline输入完成后,再执行第三个.then()的逻辑,但现在代码直接跳过输入就跑了后续步骤,导致拿到的还是初始值。
问题出在哪?
readline.question是回调式的异步API,它不会阻塞代码执行。你在第二个.then()里写完readline.question后直接返回了phoneCode,这时候用户还没来得及输入,回调函数根本没执行,所以返回的必然是初始值"beforeCode",第三个.then()自然拿不到用户输入的内容。
怎么解决?
核心思路是把readline.question的逻辑包装成一个Promise,把回调式的异步操作转换成Promise风格,这样Promise链就会自动等待它完成。
下面是修改后的完整代码:
const readline = require('readline'); // 先创建readline的接口实例(这步是使用readline的必要操作,你原来的代码可能漏了) const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); let phoneCode = "beforeCode"; const asenkronFonksiyon = () => { return new Promise((resolve, reject) => { resolve(); }); }; asenkronFonksiyon() .then(data => { return data; }) .then(data => { // 把readline的提问逻辑包装成新的Promise return new Promise((resolve) => { rl.question(`What's code?`, code => { console.log(`Hi ${data}!`); phoneCode = code; rl.close(); // 输入完成后,resolve传递用户输入的code resolve(phoneCode); }); }); }) .then(data => { // 这里的data就是用户输入的内容了 console.log("phoneCode: " + data); // 当然也可以直接用更新后的phoneCode变量 // console.log("phoneCode: " + phoneCode); });
关键改动说明:
- 补充了
readline.createInterface创建接口实例,这是使用readline模块的基础步骤。 - 在第二个
.then()中,不再直接返回phoneCode,而是返回一个新的Promise。这个Promise会等到用户输入完成、回调函数执行时,才调用resolve传递输入的值,这样Promise链就会等待输入操作完成。 - 第三个
.then()拿到的data就是用户输入的code,此时phoneCode变量也已经被更新。
更简洁的Async/Await写法
如果你觉得Promise链有点绕,也可以用async/await来简化代码,逻辑会更直观:
const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // 封装一个异步的提问函数 const askForCode = () => { return new Promise((resolve) => { rl.question(`What's code?`, code => { rl.close(); resolve(code); }); }); }; const main = async () => { await asenkronFonksiyon(); const phoneCode = await askForCode(); console.log("phoneCode: " + phoneCode); }; // 执行主函数 main();
这种写法用同步的代码风格处理异步操作,可读性会更强哦。
内容的提问来源于stack exchange,提问作者Meltem
相关产品推荐
相关产品推荐

