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