Node.js之readline模块的使用详解


Posted in Javascript onMarch 25, 2019

什么是readline

readline允许从可读流中以逐行的方式读取数据,比如process.stdin等。 在node.js命令行模式下默认引入了readline模块,但如果是使用node.js运行脚本的话,则需要自己通过require('readline')方式手动引入该模块。

怎么使用readline

创建实例

首先、创建一个接口实例,提供一个Object类型的参数。参数如下: input: 监听的可读流(必需) output: 写入readline的可写流(必需) completer: 用于 Tab 自动补全的可选函数(不常用) terminal: 如果希望 input 和 output 流像 TTY 一样对待,那么传递参数 true ,并且经由 ANSI/VT100 转码。 默认情况下检查 isTTY 是否在 output 流上实例化。(不常用) historySize: 保留行历史纪录最大值,为了禁用该值被设置为0,默认为30,只有在terminal被设置为true或通过一个内部输出检查时,这个选项才有作用,否则历史缓存机制不会初始化。(不常用)

第一种方式:只传入两个必传参数

const readLine = require('readline');
 let rl = readLine.createInterface(process.stdin, process.stdout);

第二种方式:可以传入其他非必需参数

const readLine = require('readline');
 let rl = readLine.createInterface({
  input: process.stdin,
  output: process.stdout,
  // 其他参数省略
 })

实例

const readLine = require('readline');
 let rl = readLine.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: '> 请输入'
 })
 // 调用
 rl.prompt(); // 控制台结果显示:>请输入

注意:一旦该代码被调用,Node.js程序将不会终止知道readline接口被关闭,因为接口会在输入流中不停的等待数据。

方法

以下所有的实例均依据如下rl所创建:

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

1、rl.setPrompt([prompt])

设置提示符,当你使用node运行该文件,并且调用rl.prompt()时,会在终端看到你设置的提示prompt,即“> 请输入”

rl.setPrompt('> 请输入')

注意:该方法和上面的实例参数配置是一样的效果

2、rl.prompt([preserveCursor])

为用户输入准备好readline,将现有的setPrompt选项放到新的一行,让用户有一个新的地方开始输入。将preserveCursor设为true来防止光标位置被重新设定成0。   如需要换行输入,即在新的一行,输入信息,可在prompt中加入\n。

rl.prompt(); // 控制台结果显示:>请输入

3、rl.write(data[, key])

当使用readline.createInterface()创建实例时,,如果输入流为null或者undefined,则写入数据到输出流。   key是一个表示键序列的字面量对象,如果终端是TTY,则可用。

rl.write('Delete me!');
 // Simulate ctrl+u to delete the line written previously
 rl.write(null, {ctrl: true, name: 'u'});

4、rl.question(query, callback)

预先制定提示内容query,将会在用户输入被应答后,触发执行指定的回掉函数callback。

rl.question('你今年多大了?\n', function(prompt) {
  console.log('这是你输入的回答结果:' + prompt);
  rl.close();
 })

5、rl.pause()

暂停readline的输入流,可以恢复,rl.resume()、rl.write()、rl.question()和rl.prompt()均可以恢复该输入流。   调用该方法会触发pause事件。

6、rl.resume()

恢复readline的输入流。   调用该方法会触发resume事件。

7、rl.close()

关闭readline创建的实例,不控制输入输出流。   调用该方法会触发close事件。

事件

1、line事件

无论何时,在输入流接收了一个行结束符(\n, \r, 或者 \r\n)时触发,即在用户输入后,按了回车或者返回键时触发该事件。可以用来监听用户输入。

rl.on('line', function (line) {
  console.log('这是用户输入的内容:' + line);
 })

2、pause事件

输入流被暂停时触发,即调用了rl.pause(),或者没有暂停输入流,在收到SIGCONT/SIGINT,且readline.Interfacce实例上并没有注册SIGCONT/SIGINT监听器时,也会被触发,并且如果输入流在收到SIGTSIP之前就已经被暂停了,那么该事件也不会触发。

rl.on('pause', function() {
  console.log('暂停输入流...')
 })

3、resume事件

输入流重新启动时被触发,即调用了rl.resume()、或者rl.write()、rl.question()和rl.prompt()。

rl.on('resume', function() {
  console.log('恢复输入流...')
 })

4、close事件

调用rl.close()方法时会触发该事件,或者输入流接收到“结束”事件。以下的任意一种情况都会触发close事件。 一旦close事件被触发,则认为readline.Interaface实例已经终止。 1)、rl.close()方法被调用后,readline.Interaface实例便会放弃输入输出流的控制权。 2)、输入流接收到自己的“end”事件。 3)、输入流接收到-C,发送SIGINT信号,并且在readline.Interfacce实例上并没有注册SIGINT事件的监听器。 4)、输入流接收到-D,发送传输结束信号(EOF,end-of-transmission); 5)、EOT:定界符,即输入单个或多个“>”,并按下回车时。

rl.on('close', function() {
  console.log('关闭输入流...');
  process.exit(0); // 退出当前进程
 })

5、SIGCOUT(该事件在window系统上不起作用)

当使用-Z将Node.js进程移动到后台时,SIGCONT事件将会被触发。然后可以使用 fg(1) 命令将它移动到前台。   如果输入流在收到SIGTSIP之前就已经被暂停了,那么该事件就不会触发。

6、SIGINT

当输入流收到-C命令时,我们熟知的SIGINT事件就会被触发。如果当时并没有注册任何SIGINT事件监听器,那么当输入流接收到SIGINT信号时,'pause'事件和'close'事件均会被触发。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
Feb 05 Javascript
jQuery实现id模糊查询的小例子
Mar 19 Javascript
如何将一个String和多个String值进行比较思路分析
Apr 22 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
Jan 26 Javascript
给html超链接设置事件不使用href来完成跳
Apr 20 Javascript
jquery仿百度百科底部浮动导航特效
Aug 08 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
Jun 02 Javascript
微信分享调用jssdk实例
Jun 08 Javascript
vue2.0实现前端星星评分功能组件实例代码
Feb 12 Javascript
详解创建自定义的Angular Schematics
Jun 06 Javascript
vue-router实现编程式导航的代码实例
Jan 19 Javascript
解决echarts数据二次渲染不成功的问题
Jul 20 Javascript
Javascript的this详解
Mar 23 #Javascript
如何在Angular应用中创建包含组件方法示例
Mar 23 #Javascript
vue中组件的3种使用方式详解
Mar 23 #Javascript
ES6入门教程之Array.from()方法
Mar 23 #Javascript
setTimeout与setInterval的区别浅析
Mar 23 #Javascript
如何通过setTimeout理解JS运行机制详解
Mar 23 #Javascript
vue中axios请求的封装实例代码
Mar 23 #Javascript
You might like
php 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
PHP中数组的三种排序方法分享
2012/05/07 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
2015/11/19 PHP
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:07:34]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第二场 1月9日
2021/03/11 DOTA
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
python实现抽奖小程序
2020/04/15 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
自荐信怎么写呢?
2013/12/09 职场文书
业务部主管岗位职责
2014/01/29 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
技术合作协议书范本
2014/04/18 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
React实现动效弹窗组件
2021/06/21 Javascript
我的收音机情缘
2022/04/05 无线电
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL
从原生JavaScript到React深入理解
2022/07/23 Javascript