IT兄弟會(huì)全棧工程師01班第5課筆記

本課重點(diǎn):學(xué)習(xí)使用Node.js中的'readline'模塊實(shí)現(xiàn)終端的io交互功能豺鼻,并衍生到web中靜態(tài)頁面上的io交互功能實(shí)現(xiàn)沫勿。

Readline模塊

要使用此模塊挨约,需要require('readline');Readline程序允許逐行讀取一個(gè)流內(nèi)容(例如process.stdin)味混。
引入'readline'模塊:

 var readline = require('readline');

需要注意的是你一旦調(diào)用了這個(gè)模塊,你的node程序?qū)⒉粫?huì)終止直到你關(guān)閉此接口诫惭。下面是如何讓你的程序正常退出的方法:

rl.close();

readline.createInterface(options)

創(chuàng)建一個(gè)readline的接口實(shí)例.

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

接受一個(gè)Object類型參數(shù)翁锡,可傳遞以下幾個(gè)值:

  • input 要監(jiān)聽的可讀流 (必需).
  • output 要寫入 readline 的可寫流 (必須).
  • completer 用于 Tab 自動(dòng)補(bǔ)全的可選函數(shù)。見下面使用的例子夕土。
  • terminal如果希望 input 和 output流像 TTY 一樣對待馆衔,那么傳遞參數(shù) true,并且經(jīng)由 ANSI/VT100 轉(zhuǎn)碼怨绣。 默認(rèn)情況下檢查 isTTY是否在 output 流上實(shí)例化角溃。

通過用戶 completer函數(shù)給定了一個(gè)當(dāng)前行入口,并且期望返回一個(gè)包含兩個(gè)條目的數(shù)組:
1.一個(gè)匹配當(dāng)前輸入補(bǔ)全的字符串?dāng)?shù)組.
2.一個(gè)用于匹配的子字符串篮撑。
最終像這種形式:

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

.

rl.setPrompt(prompt)

設(shè)置提示符减细,例如當(dāng)你在命令行運(yùn)行 node時(shí),你會(huì)看到 > 赢笨,這就是 node 的提示符未蝌。

rl.prompt([preserveCursor])

為用戶輸入準(zhǔn)備好readline,將現(xiàn)有的setPrompt選項(xiàng)放到新的一行茧妒,讓用戶有一個(gè)新的地方開始輸入萧吠。將preserveCursor設(shè)為true來防止光標(biāo)位置被重新設(shè)定成0。

如果暫停桐筏,也會(huì)使用 createInterface重置 input流纸型。

rl.question(query, callback)

預(yù)先提示指定的query,然后用戶應(yīng)答后觸發(fā)指定的callback九昧。 顯示指定的query給用戶后绊袋,當(dāng)用戶的應(yīng)答被輸入后,就觸發(fā)了指定的callback

如果暫停铸鹰,也會(huì)使用 createInterface重置 input流癌别。示例:

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

rl.pause()

暫停 readline 的輸入流 (inputstream), 如果有需要稍后還可以恢復(fù)。

rl.resume()

恢復(fù) readline 的輸入流 (inputstream).

rl.close()

關(guān)閉接口實(shí)例 (Interfaceinstance), 放棄控制輸入輸出流蹋笼。"close" 事件會(huì)被觸發(fā)展姐。

rl.write(data, [key])

將 data寫入到 output流。key是一個(gè)代表鍵序列的對象剖毯;當(dāng)終端是一個(gè) TTY 時(shí)可用圾笨。

如果暫停,也會(huì)重置 input流逊谋。實(shí)例:

rl.write('Delete me!');
// 模仿 ctrl+u快捷鍵擂达,刪除之前所寫行
rl.write(null, {ctrl: true, name: 'u'});

事件說明

事件:'line'

在 input流接受了一個(gè) \n時(shí)觸發(fā),通常在用戶敲擊回車或者返回時(shí)接收胶滋。 這是一個(gè)監(jiān)聽用戶輸入的利器板鬓。
監(jiān)聽 line事件的示例:

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

事件: 'resume'

不論何時(shí)悲敷,只要輸入流重新啟用就會(huì)觸發(fā)。示例:

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

事件: 'close'

當(dāng) close()被調(diào)用時(shí)觸發(fā)俭令。

當(dāng) input流接收到"結(jié)束"事件時(shí)也會(huì)被觸發(fā). 一旦觸發(fā)后德,應(yīng)當(dāng)認(rèn)為Interface實(shí)例 "結(jié)束" . 例如, 當(dāng)input流接收到^D時(shí), 分別被認(rèn)為EOT.

當(dāng) input流接收到一個(gè) ^C時(shí),即使沒有 SIGINT監(jiān)聽器抄腔,也會(huì)觸發(fā)這個(gè)事件瓢湃,分別被稱為 SIGINT 。

事件:'SIGINT'

只要 input流 接收到^C就會(huì)被觸發(fā), 分別被認(rèn)為SIGINT.當(dāng)input流接收到SIGINT時(shí), 如果沒有 SIGINT事件監(jiān)聽器赫蛇,pause將會(huì)被觸發(fā).

監(jiān)聽 SIGINT信號(hào)的示例:

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 操作系統(tǒng)

只要input流接收到^Z時(shí)就被觸發(fā), 分別被認(rèn)為SIGTSTP. 當(dāng)input流接收到 SIGTSTP時(shí)绵患,如果沒有SIGTSTP
事件監(jiān)聽器 ,程序會(huì)被發(fā)送到后臺(tái) .

當(dāng)程序使用參數(shù) fg重啟,pause和 SIGCONT事件將會(huì)被觸發(fā)悟耘。 你可以使用兩者中任一事件來恢復(fù)流藏雏。

在程序被發(fā)送到后臺(tái)之前,如果流暫停作煌,pause和 SIGCONT事件將不會(huì)被觸發(fā)。
監(jiān)聽 SIGTSTP的示例:

rl.on('SIGTSTP', function() { 
// 這將重載 SIGTSTP并防止程序轉(zhuǎn)到 
// 后臺(tái). 
  console.log('Caught SIGTSTP.');
});

事件:'SIGCONT'

該功能不支持 windows 操作系統(tǒng)

一旦 input流中含有 ^Z并被發(fā)送到后臺(tái)就會(huì)觸發(fā),分別被認(rèn)為 SIGTSTP, 然后繼續(xù)執(zhí)行fg(1). 這一事件只有在流被發(fā)送后臺(tái)之前沒有暫停才會(huì)觸發(fā).
監(jiān)聽 SIGCONT的示例:

rl.on('SIGCONT', function() {
// `prompt` 將會(huì)自動(dòng)恢復(fù)流 
rl.prompt();
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赚瘦,一起剝皮案震驚了整個(gè)濱河市粟誓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌起意,老刑警劉巖鹰服,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揽咕,居然都是意外死亡悲酷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門亲善,熙熙樓的掌柜王于貴愁眉苦臉地迎上來设易,“玉大人,你說我怎么就攤上這事蛹头《俜危” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵渣蜗,是天一觀的道長屠尊。 經(jīng)常有香客問我,道長耕拷,這世上最難降的妖魔是什么讼昆? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮骚烧,結(jié)果婚禮上浸赫,老公的妹妹穿的比我還像新娘闰围。我一直安慰自己,他們只是感情好掺炭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布辫诅。 她就那樣靜靜地躺著,像睡著了一般涧狮。 火紅的嫁衣襯著肌膚如雪炕矮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天者冤,我揣著相機(jī)與錄音肤视,去河邊找鬼。 笑死涉枫,一個(gè)胖子當(dāng)著我的面吹牛邢滑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愿汰,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼困后,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衬廷?” 一聲冷哼從身側(cè)響起摇予,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吗跋,沒想到半個(gè)月后侧戴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跌宛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年酗宋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疆拘。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜕猫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哎迄,到底是詐尸還是另有隱情丹锹,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布芬失,位于F島的核電站楣黍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棱烂。R本人自食惡果不足惜租漂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哩治,春花似錦秃踩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蒜胖,卻和暖如春消别,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背台谢。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工寻狂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朋沮。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓蛇券,卻偏偏與公主長得像,于是被迫代替她去往敵國和親樊拓。 傳聞我的和親對象是個(gè)殘疾皇子纠亚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容