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 相关文章推荐
js函数在frame中的相互调用详解
Mar 03 Javascript
javascript删除数组重复元素的方法汇总
Jun 24 Javascript
常见JS验证脚本汇总
Dec 01 Javascript
Javascript基础_简单比较undefined和null 值
Jun 14 Javascript
移动端点击态处理的三种实现方式
Jan 12 Javascript
基于JavaScript实现轮播图原理及示例
Apr 10 Javascript
微信小程序 MD5的方法详解及实例代码
Mar 10 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
Mar 27 Javascript
JS实现简单获取最近7天和最近3天日期的方法
Apr 18 Javascript
在vue中解决提示警告 for循环报错的方法
Sep 28 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
Dec 11 Javascript
js实现表单项的全选、反选及删除操作示例
Jun 05 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
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
javascript 全角转换实现代码
2009/07/17 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
javascript中 try catch用法
2015/08/16 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
Javascript继承机制详解
2017/05/30 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
详解Python中的文件操作
2016/08/28 Python
对python判断是否回文数的实例详解
2019/02/08 Python
详解Python 函数如何重载?
2019/04/23 Python
anaconda如何查看并管理python环境
2019/07/05 Python
如何实现Django Rest framework版本控制
2019/07/25 Python
Python 硬币兑换问题
2019/07/29 Python
python修改FTP服务器上的文件名
2019/09/11 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
css3 中实现炫酷的loading效果
2019/04/26 HTML / CSS
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
本科毕业生自荐信
2014/06/02 职场文书
社会学专业求职信
2014/07/17 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
JS数组去重详情
2021/11/07 Javascript
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python