美文网首页
IT兄弟会全栈工程师01班第5课笔记

IT兄弟会全栈工程师01班第5课笔记

作者: 疯范儿 | 来源:发表于2016-08-11 09:44 被阅读0次

    本课重点:学习使用Node.js中的'readline'模块实现终端的io交互功能,并衍生到web中静态页面上的io交互功能实现。

    Readline模块

    要使用此模块,需要require('readline');Readline程序允许逐行读取一个流内容(例如process.stdin)。
    引入'readline'模块:

     var readline = require('readline');
    

    需要注意的是你一旦调用了这个模块,你的node程序将不会终止直到你关闭此接口。下面是如何让你的程序正常退出的方法:

    rl.close();
    

    readline.createInterface(options)

    创建一个readline的接口实例.

    var rl = readline.createInterface(process.stdin, process.stdout);
    

    接受一个Object类型参数,可传递以下几个值:

    • input 要监听的可读流 (必需).
    • output 要写入 readline 的可写流 (必须).
    • completer 用于 Tab 自动补全的可选函数。见下面使用的例子。
    • terminal如果希望 input 和 output流像 TTY 一样对待,那么传递参数 true,并且经由 ANSI/VT100 转码。 默认情况下检查 isTTY是否在 output 流上实例化。

    通过用户 completer函数给定了一个当前行入口,并且期望返回一个包含两个条目的数组:
    1.一个匹配当前输入补全的字符串数组.
    2.一个用于匹配的子字符串。
    最终像这种形式:

     [[substr1, substr2, ...], originalsubstring]
    

    .

    rl.setPrompt(prompt)

    设置提示符,例如当你在命令行运行 node时,你会看到 > ,这就是 node 的提示符。

    rl.prompt([preserveCursor])

    为用户输入准备好readline,将现有的setPrompt选项放到新的一行,让用户有一个新的地方开始输入。将preserveCursor设为true来防止光标位置被重新设定成0。

    如果暂停,也会使用 createInterface重置 input流。

    rl.question(query, callback)

    预先提示指定的query,然后用户应答后触发指定的callback。 显示指定的query给用户后,当用户的应答被输入后,就触发了指定的callback

    如果暂停,也会使用 createInterface重置 input流。示例:

    interface.question('What is your favorite food?', function(answer) {
         console.log('Oh, so your favorite food is ' + answer);
    });
    

    rl.pause()

    暂停 readline 的输入流 (inputstream), 如果有需要稍后还可以恢复。

    rl.resume()

    恢复 readline 的输入流 (inputstream).

    rl.close()

    关闭接口实例 (Interfaceinstance), 放弃控制输入输出流。"close" 事件会被触发。

    rl.write(data, [key])

    将 data写入到 output流。key是一个代表键序列的对象;当终端是一个 TTY 时可用。

    如果暂停,也会重置 input流。实例:

    rl.write('Delete me!');
    // 模仿 ctrl+u快捷键,删除之前所写行
    rl.write(null, {ctrl: true, name: 'u'});
    

    事件说明

    事件:'line'

    在 input流接受了一个 \n时触发,通常在用户敲击回车或者返回时接收。 这是一个监听用户输入的利器。
    监听 line事件的示例:

    rl.on('line', function (cmd) {
      console.log('You just typed: '+cmd);
    });
    

    事件: 'resume'

    不论何时,只要输入流重新启用就会触发。示例:

    rl.on('resume', function() {
    console.log('Readline 恢复.');
    });
    

    事件: 'close'

    当 close()被调用时触发。

    当 input流接收到"结束"事件时也会被触发. 一旦触发,应当认为Interface实例 "结束" . 例如, 当input流接收到^D时, 分别被认为EOT.

    当 input流接收到一个 ^C时,即使没有 SIGINT监听器,也会触发这个事件,分别被称为 SIGINT 。

    事件:'SIGINT'

    只要 input流 接收到^C就会被触发, 分别被认为SIGINT.当input流接收到SIGINT时, 如果没有 SIGINT事件监听器,pause将会被触发.

    监听 SIGINT信号的示例:

    rl.on('SIGINT', function() {
      rl.question('Are you sure you want to exit?', function(answer) { 
      if (answer.match(/^y(es)?$/i)) rl.pause(); 
      });
    });
    

    事件:Event: 'SIGTSTP'

    该功能不支持 windows 操作系统

    只要input流接收到^Z时就被触发, 分别被认为SIGTSTP. 当input流接收到 SIGTSTP时,如果没有SIGTSTP
    事件监听器 ,程序会被发送到后台 .

    当程序使用参数 fg重启,pause和 SIGCONT事件将会被触发。 你可以使用两者中任一事件来恢复流。

    在程序被发送到后台之前,如果流暂停,pause和 SIGCONT事件将不会被触发。
    监听 SIGTSTP的示例:

    rl.on('SIGTSTP', function() { 
    // 这将重载 SIGTSTP并防止程序转到 
    // 后台. 
      console.log('Caught SIGTSTP.');
    });
    

    事件:'SIGCONT'

    该功能不支持 windows 操作系统

    一旦 input流中含有 ^Z并被发送到后台就会触发,分别被认为 SIGTSTP, 然后继续执行fg(1). 这一事件只有在流被发送后台之前没有暂停才会触发.
    监听 SIGCONT的示例:

    rl.on('SIGCONT', function() {
    // `prompt` 将会自动恢复流 
    rl.prompt();
    });
    

    相关文章

      网友评论

          本文标题:IT兄弟会全栈工程师01班第5课笔记

          本文链接:https://www.haomeiwen.com/subject/kwnjsttx.html