Node的事件處理和readline模塊詳解
一、Node的事件處理
1、采用事件驅(qū)動(dòng)模型
2、Node是單線程的,采用事件輪詢方式來(lái)處理事件
3、事件機(jī)制中的三個(gè)角色:
事件(Event)、事件發(fā)生器(EventEmitter)、事件監(jiān)聽(tīng)器(EventListener)
const http = require('http'); //創(chuàng)建服務(wù)器對(duì)象 let server = http.createServer(); //給服務(wù)器對(duì)象綁定事件request server.once('request',function (req,res){ console.log('----request-1----') }) server.on('request',function (req,res) { console.log('請(qǐng)求地址:',req.url) res.end('Hello World') }) server.once('request',function (req,res) { console.log('---- Response End ----') }) //服務(wù)器啟動(dòng)監(jiān)聽(tīng) server.listen(8089,'127.0.0.1') //在網(wǎng)址處查找http://127.0.0.1:8089 // ----request-1---- // 請(qǐng)求地址: / // ---- Response End ---- // 請(qǐng)求地址: /favicon.ico //頁(yè)面處顯示Hello World
const EventEmitter = require('events').EventEmitter; const emitter = new EventEmitter(); emitter.on('beep',function (){ //先執(zhí)行這個(gè)回調(diào)函數(shù),輸出beep console.log('beep') }) emitter.on('beep',function (){ //然后再執(zhí)行這個(gè)回調(diào)函數(shù),拋出一個(gè)錯(cuò)誤,會(huì)被catch接收到 throw Error('oops!'); //因?yàn)檫@個(gè)函數(shù)執(zhí)行完之后,發(fā)生異常,已經(jīng)被扔出去,所以后面的函數(shù)就不會(huì)再被執(zhí)行 }) emitter.on('beep',function (){ console.log('beep again!'); }) //手動(dòng)觸發(fā)事件 try{ emitter.emit('beep') }catch (e) { console.log(e.message) //e.message指得就是Error對(duì)象。message對(duì)應(yīng)的就是error對(duì)象的字符串(oops) } // beep // oops!
二、通過(guò)Node的readline模塊實(shí)現(xiàn)終端的輸入
1、標(biāo)準(zhǔn)輸入輸出:鍵盤(pán)、鼠標(biāo)、顯示器
2、使用方法
(1)引入:require('readline')
(2)創(chuàng)建readline對(duì)象(接口)
(3)調(diào)用接口的相關(guān)方法
(4)監(jiān)聽(tīng)和處理readline事件
onst readline = require('readline'); //創(chuàng)建readline實(shí)例(接口對(duì)象) let r1 = readline.createInterface({ input: process.stdin, output : process.stdout }) //調(diào)用接口方法 r1.question("請(qǐng)輸入姓名:",function (answer) { //有一個(gè)輸入提示,輸入數(shù)據(jù)后,會(huì)開(kāi)始調(diào)用回調(diào)函數(shù) console.log("姓名是:",answer) //將輸入的字符串,賦給回調(diào)函數(shù)的參數(shù)answer,然后輸出 r1.close() //用r1這個(gè)方法去觸發(fā)這個(gè)close事件 }) //給readline實(shí)例綁定close事件 r1.on('close',function (){ //事件觸發(fā)后,整個(gè)進(jìn)程才能結(jié)束 process.exit(0) }) // 請(qǐng)輸入姓名:云汐(云汐需要自己手動(dòng)輸入后,點(diǎn)擊回車(chē)) // 姓名是: 云汐
const readline = require('readline'); const r1 = readline.createInterface(process.stdin,process.stdout); r1.setPrompt('Test>'); //方法setPromat(promat) ,就是給每一行設(shè)置一個(gè)提示符, //就好比window命令行的> ,這里設(shè)置的是Test> r1.prompt(); //prompt()是最重要的方法,因?yàn)樗w現(xiàn)了readline的核心作用, //以行為單位讀取數(shù)據(jù),prompt方法就是在等待用戶輸入數(shù)據(jù) r1.on('line',function (line){ //監(jiān)聽(tīng)了'line' 事件,因?yàn)閜rompt方法調(diào)用一次就只會(huì)讀取一次數(shù)據(jù) switch (line.trim()){ case 'copy': console.log('復(fù)制'); break; case 'hello': console.log('world') break case 'close': r1.close() break default:console.log('沒(méi)有找到命令') break } r1.prompt() //所以,在這個(gè)方法又調(diào)用了一次prompt方法,這樣就可以繼續(xù)讀取用戶輸入,從而達(dá)到一種命令行的效果 }); r1.on('close',function (){ console.log('bye bye'); process.exit(0) })
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
為nuxt項(xiàng)目寫(xiě)一個(gè)面包屑cli工具實(shí)現(xiàn)自動(dòng)生成頁(yè)面與面包屑配置
這篇文章主要介紹了為nuxt項(xiàng)目寫(xiě)一個(gè)面包屑cli工具實(shí)現(xiàn)自動(dòng)生成頁(yè)面與面包屑配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Nodejs學(xué)習(xí)筆記之Global Objects全局對(duì)象
本文是NodeJS學(xué)習(xí)筆記系列文章的第二篇,從這篇開(kāi)始我們就根據(jù)官方文檔來(lái)逐個(gè)學(xué)習(xí)下NodeJS的各個(gè)模塊,首先我們來(lái)學(xué)習(xí)下Global2015-01-01Nodejs?Docker鏡像體積優(yōu)化實(shí)踐詳解
這篇文章主要為大家介紹了Nodejs?Docker鏡像體積優(yōu)化實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07詳解nodeJS之二進(jìn)制buffer對(duì)象
本篇文章主要介紹了nodeJS之二進(jìn)制buffer對(duì)象,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06Node.js視頻流應(yīng)用創(chuàng)建之后端的全過(guò)程
這篇文章主要給大家介紹了關(guān)于創(chuàng)建Node.js視頻流應(yīng)用之后端的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03Node.js與Sails ~項(xiàng)目結(jié)構(gòu)與Mvc實(shí)現(xiàn)及日志機(jī)制
Sails是一個(gè)Node.js的中間架構(gòu),很方便的幫助我們搭建web應(yīng)用程序。還有node.js與Sails日志機(jī)制在本文中也講到了,需要的朋友可以一起學(xué)習(xí)下2015-10-10sublime text配置node.js調(diào)試(圖文教程)
下面小編就為大家分享一篇sublime text配置node.js調(diào)試(圖文教程),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11