为什么只有一个 Node readline 对象有效?

Why does only one Node readline object work?

在下面的 node.js 示例中,我想向用户询问两个数字,然后 return 将总和返回到控制台。我已经使用 readline.question() 两次(每个数字一个),但只要求用户提供第二个数字。为什么第一个控制台提示没有出现?

const readline = require('readline');

let firstNumber = 0;
let secondNumber = 0;

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.question('Your first number: ', (answer) => {
    firstNumber = parseInt(answer);
    rl.close();
});

const r2 = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

r2.question('Your second number: ', (answer) => {
    secondNumber = parseInt(answer);
    console.log(`The sum of these numbers is: ${secondNumber + firstNumber}`);
    r2.close();
});

如果你想等第一个问题得到回答,你需要在答案返回后再问第二个,像这样:

const readline = require('readline');

let firstNumber = 0;
let secondNumber = 0;

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
rl.question('Your first number: ', (answer) => {
    firstNumber = parseInt(answer);
    rl.question('Your second number: ', (answer) => {
        secondNumber = parseInt(answer);
        console.log(`The sum of these numbers is: ${secondNumber + firstNumber}`);
        rl.close();
    });
});

在 javascript 中花费时间的功能已安排,解释器继续。

如果你想在其他事情之后发生某些事情,你需要在回调或 promise.then 机制中进行。

你会掌握窍门的。

可能是竞争条件? question 似乎是一个异步函数,因此当第一个实例尝试写入输出流时第二个实例已暂停它是合理的。

你真的不需要两个实例,等待第一个问题的响应,然后在第一个问题的回调中提示第二个,例如

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('Your first number: ', ans1 => {
  first = parseInt(ans1);
  rl.question('Your second number: ', ans2 => {
    second = parseInt(ans2);
    console.log(`The sum of these numbers is: ${second + first}`);
    rl.close();
  });
});