node.js学习之readline模块

在 Node.js 中,readline 模块提供了一种逐行读取数据流的方法。它允许你从一个可读流(如 process.stdin)中读取用户输入,并且可以对用户的输入进行处理。

readline 模块提供了几个核心类,包括 Interface 和 Readline,它们可以用于读取和处理用户输入。使用 readline 模块,你可以编写交互式的命令行工具,如命令行脚本或控制台应用程序。

readline模块提供了一个接口,用于从可读流中读取数据,例如从标准输入读取用户输入。


readline模块的基本方法:

首先,需要使用require语句引入readline模块:

const readline = require('readline');

创建一个readline.Interface对象。此对象接收一个输入流和一个输出流作为参数:

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

使用rl.question()方法从输入流中读取数据。该方法接受两个参数:一个提示字符串和一个回调函数。在回调函数中可以使用读取到的数据进行后续处理:

rl.question('请输入一个字符串:', (answer) => {
  console.log(`你输入的是:${answer}`);
  rl.close();
});

当读取完成后,需要使用rl.close()方法关闭readline.Interface对象。
完整的示例代码如下:

const readline = require('readline');

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

rl.question('请输入一个字符串:', (answer) => {
  console.log(`你输入的是:${answer}`);
  rl.close();
});

使用promise封装question方法

question 是一个异步方法,所以当我们想要实现一个简易的计算器时,为了保证数字输入的顺序正确,就必须是要将函数嵌套起来使用,例如:

const readline = require('readline');

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

rl.question('请输入第一个数字:', (num1) => {
  rl.question('请输入运算符:', (operator) => {
    rl.question('请输入第二个数字:', (num2) => {
      let result;
      switch(operator) {
        case '+':
          result = parseFloat(num1) + parseFloat(num2);
          break;
        case '-':
          result = parseFloat(num1) - parseFloat(num2);
          break;
        case '*':
          result = parseFloat(num1) * parseFloat(num2);
          break;
        case '/':
          result = parseFloat(num1) / parseFloat(num2);
          break;
        default:
          console.log('运算符输入有误,请重新输入!');
          rl.close();
          return;
      }
      console.log(`${num1} ${operator} ${num2} = ${result}`);
      rl.close();
    });
  });
});

这样会导致代码风格往又越来越长,相当不方便阅读和浏览,这个时候我们就可以将他们封装成promise对象,进行链式调用,就可以保证数字的输入顺序是一定的:

const readline = require('readline');

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

  return new Promise((resolve, reject) => {
    rl.question(prompt, (input) => {
      rl.close();
      resolve(input);
    });
  });
}

function calculate() {
  let num1, num2, operator;
  return getInput('请输入第一个数字:')
    .then(input => {
      num1 = parseFloat(input);
      return getInput('请输入运算符:');
    })
    .then(input => {
      operator = input.trim();
      if (!['+', '-', '*', '/'].includes(operator)) {
        throw new Error('运算符输入有误,请重新输入!');
      }
      return getInput('请输入第二个数字:');
    })
    .then(input => {
      num2 = parseFloat(input);
      let result;
      switch(operator) {
        case '+':
          result = num1 + num2;
          break;
        case '-':
          result = num1 - num2;
          break;
        case '*':
          result = num1 * num2;
          break;
        case '/':
          result = num1 / num2;
          break;
        default:
          throw new Error('运算符输入有误,请重新输入!');
      }
      console.log(`${num1} ${operator} ${num2} = ${result}`);
    })
    .catch(error => {
      console.error(error.message);
    });
}

calculate();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值