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

如何在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);
  });

关键改动说明:

  1. 补充了readline.createInterface创建接口实例,这是使用readline模块的基础步骤。
  2. 在第二个.then()中,不再直接返回phoneCode,而是返回一个新的Promise。这个Promise会等到用户输入完成、回调函数执行时,才调用resolve传递输入的值,这样Promise链就会等待输入操作完成。
  3. 第三个.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:14:35