Node.js使用line-by-line依赖时readline输入提示无响应问题
问题根因
你代码的问题出在readline模块的question方法是异步执行的:
- 调用
rl.question()时只会先把问题打印出来,传入的回调函数要等用户实际输入内容按下回车之后才会执行 - 你当前的代码顺序执行时,三个
rl.question触发打印后,主线程会立刻执行后面的拼接打印逻辑,此时三个变量还没被回调赋值,所以全是undefined - 打印完你又直接调用了
rl.close()关闭了输入接口,程序直接终止,根本不会等待用户输入
修复方案
方案1:回调嵌套(最直观的适配写法)
把后续的提问逻辑和收尾操作都放在前一个提问的回调里,保证顺序执行:
var rlname; var rlage; var rlcolor; const readline = require('readline'); const rl = readline.createInterface ({ input: process.stdin, output: process.stdout, prompt: '>' }); function getUserInput() { rl.question("What is your name? \n", (name) => { rlname = name; rl.question("What is your age? \n", (age) => { rlage = age; rl.question("What is your favorite color? \n", (color) => { rlcolor = color; console.log("Hello " + rlname + ", you are " + rlage + " years old and your favorite color is " + rlcolor + "."); // 所有逻辑执行完再关闭接口 rl.close(); }) }) }) } getUserInput();
方案2:Promise+async/await(代码结构更清晰,避免回调嵌套)
把提问逻辑封装成Promise,用同步的写法实现异步执行顺序:
const readline = require('readline'); const rl = readline.createInterface ({ input: process.stdin, output: process.stdout, prompt: '>' }); // 封装提问为Promise function question(query) { return new Promise(resolve => rl.question(query, resolve)); } async function getUserInput() { const rlname = await question("What is your name? \n"); const rlage = await question("What is your age? \n"); const rlcolor = await question("What is your favorite color? \n"); console.log(`Hello ${rlname}, you are ${rlage} years old and your favorite color is ${rlcolor}.`); rl.close(); } getUserInput();
内容的提问来源于stack exchange,提问作者Fikrys
相关产品推荐
相关产品推荐

