摘要:一個(gè)匿名函數(shù),執(zhí)行,事件全部完成,執(zhí)行最后一句,程序執(zhí)行完畢。這個(gè)事件的監(jiān)聽(tīng)器為一個(gè)匿名函數(shù),事件名稱為,當(dāng)秒以后被觸發(fā)先對(duì)象發(fā)送一個(gè)事件觸發(fā)了匿名函數(shù)即監(jiān)聽(tīng)器,監(jiān)聽(tīng)器被執(zhí)行。
node.js事件循環(huán)
node.js單進(jìn)程,單線程的程序
每一個(gè)api都支持回調(diào)
所有的事件機(jī)制都是設(shè)計(jì)模式中的
一共是23種設(shè)計(jì)模式事件驅(qū)動(dòng)程序
http://design-patterns.readth...
一個(gè)對(duì)象發(fā)生改變的時(shí)候,將自動(dòng)通知其他對(duì)象,其他對(duì)象將相應(yīng)的做出反應(yīng)。發(fā)生改變的對(duì)象為觀察目標(biāo),被通知的對(duì)象為觀察者。一個(gè)觀察目標(biāo)可以對(duì)應(yīng)多個(gè)觀察者,而這些觀察者之間沒(méi)有任何聯(lián)系,可以根據(jù)需要增加觀察者,使得系統(tǒng)更加容易擴(kuò)展,依賴關(guān)系為一對(duì)多,又被稱為模型-視圖模式
web server接收到請(qǐng)求,將其關(guān)閉,進(jìn)行處理,然后接著服務(wù)下一個(gè)web請(qǐng)求。
當(dāng)請(qǐng)求完成以后,放回處理隊(duì)列,當(dāng)?shù)竭_(dá)隊(duì)列開(kāi)頭的時(shí)候,將其結(jié)果返回給用戶
即非阻塞式I/O 事件驅(qū)動(dòng)I/O
會(huì)有一個(gè)主循環(huán)來(lái)監(jiān)聽(tīng)事件,當(dāng)檢測(cè)到事件以后,觸發(fā)回調(diào)函數(shù)
PS C:UsersmingmDesktop est> node main.js 連接成功 數(shù)據(jù)接收成功 程序執(zhí)行完畢 PS C:UsersmingmDesktop est>
// 引入一個(gè) events 模塊 var events = require("events"); // 創(chuàng)建 eventEmitter對(duì)象 var eventEmitter = new events.EventEmitter(); // 創(chuàng)建connection事件的處理程序 var connectHandLer = function connected() { console.log("連接成功"); // 觸發(fā) data_received 事件 eventEmitter.emit("data_received"); }; // 綁定cinnection事件處理程序 eventEmitter.on("connection", connectHandLer); // 綁定data_received事件,并完成處理程序的書(shū)寫(xiě) eventEmitter.on( "data_received", function() { console.log("數(shù)據(jù)接收成功"); } ); // 觸發(fā) connection 事件 eventEmitter.emit("connection"); console.log("程序執(zhí)行完畢");
程序的執(zhí)行過(guò)程,先完成各種綁定,觸發(fā)connection事件以后,尋找綁定的處理程序,為connected(),然后,執(zhí)行一半,又被觸發(fā),data_received事件。尋找綁定的處理程序。一個(gè)匿名函數(shù),執(zhí)行,事件全部完成,執(zhí)行最后一句,程序執(zhí)行完畢。
多用戶執(zhí)行的情況下,觸發(fā)事件以后,若處理程序正被其他用戶占用,排隊(duì),直到前方全部處理完成以后,接著該用戶使用處理程序進(jìn)行處理。
node所有的異步I/O操作在完成的時(shí)候都會(huì)發(fā)送到一個(gè)事件到達(dá)事件隊(duì)列。node里的對(duì)象能夠分發(fā)事件
產(chǎn)生的事件的對(duì)象都是events.EventEmitter的實(shí)例
events模塊提供一個(gè)對(duì)象,它是對(duì)事件的觸發(fā)和事件的監(jiān)聽(tīng)的封裝
PS C:UsersmingmDesktop est> node main.js 事件觸發(fā) PS C:UsersmingmDesktop est>
過(guò)五秒后響應(yīng)
// event.js文件 var EventEmitter = require("events").EventEmitter; var event = new EventEmitter(); // 創(chuàng)建一個(gè)event對(duì)象 event.on("some_event", function(){console.log("事件觸發(fā)");}); setTimeout(function(){event.emit("some_event");}, 5000);
大概解釋一下這段代碼
前兩句很簡(jiǎn)單,后兩句說(shuō)一下,event的對(duì)象注冊(cè)了一個(gè)事件的監(jiān)聽(tīng)器。這個(gè)事件的監(jiān)聽(tīng)器為一個(gè)匿名函數(shù),事件名稱為some_event,當(dāng)5000秒以后被觸發(fā)先對(duì)象event發(fā)送一個(gè)事件some_event觸發(fā)了匿名函數(shù)即監(jiān)聽(tīng)器,監(jiān)聽(tīng)器被執(zhí)行。
其中EventEmitter的每個(gè)事件由一個(gè)事件名和若干參數(shù)組成,對(duì)于一個(gè)事件能有若干的監(jiān)聽(tīng)器,當(dāng)事件觸發(fā)的時(shí)候,監(jiān)聽(tīng)器會(huì)被依次調(diào)用,事件參數(shù)作為回調(diào)函數(shù)的參數(shù)進(jìn)行傳遞,需要注意的是,監(jiān)聽(tīng)器會(huì)被依次調(diào)用
error是一個(gè)多帶帶列出來(lái)的事件,一般要為其綁定一個(gè)監(jiān)聽(tīng)器,因?yàn)閚ode如果拋出error,若沒(méi)有監(jiān)聽(tīng)器執(zhí)行,將會(huì)直接退出執(zhí)行,并返回錯(cuò)誤
Buffer緩沖區(qū)處理TCP或者文件流的時(shí)候,需要用到二進(jìn)制的數(shù)據(jù),定義了一個(gè)Buffer類(lèi),該類(lèi)用于專(zhuān)門(mén)存放二進(jìn)制數(shù)據(jù)的緩沖區(qū)
Buffer與字符編碼const buf = Buffer.from("ming", "ascii"); // 聲明一個(gè)只讀的變量 console.log(buf.toString("hex")); console.log(buf.toString("utf-8"));
PS C:UsersmingmDesktop est> node main.js 6d696e67 ming PS C:UsersmingmDesktop est>創(chuàng)建一個(gè)buffer類(lèi),并完成讀取寫(xiě)入
PS C:UsersmingmDesktop est> node main.js 23456789:;<=>?@ABCDEFGHIJK 23456789:;<=>?@ABCDEFGHIJK PS C:UsersmingmDesktop est>
buf = Buffer.alloc(26); for(var i = 0; i < 26; i++){ buf[i] = 50 + i; }; console.log(buf.toString("ascii")); console.log(buf.toString("utf8"));將buffer轉(zhuǎn)換為jsoon
PS C:UsersmingmDesktop est> node main.js {"type":"Buffer","data":[1,2,3,4,5]} PS C:UsersmingmDesktop est>
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]); const json = JSON.stringify(buf); console.log(json);將JSON轉(zhuǎn)換為Buffer 一個(gè)轉(zhuǎn)換方法JSON.parse
> JSON.parse("{"1": 3, "2": [4, 5, 6]}", function (k, v) { ... console.log(k); // 輸出當(dāng)前的屬性名,從而得知遍歷順序是從內(nèi)向外的, ... console.log("----------"); // 最后一個(gè)屬性名會(huì)是個(gè)空字符串。 ... console.log(v); ... }); 1 ---------- 3 0 ---------- 4 1 ---------- 5 2 ---------- 6 2 ---------- [ <3 empty items> ] ---------- {} undefined >開(kāi)始轉(zhuǎn)換
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]); const json = JSON.stringify(buf); console.log(json); const copy = JSON.parse( // 調(diào)用JSON.parse函數(shù),將字符串轉(zhuǎn)換為對(duì)象,后一個(gè)參數(shù)為轉(zhuǎn)換的函數(shù),轉(zhuǎn)換的時(shí)候?qū)?huì)調(diào)用 json, (key, value) => { // 此為es6的語(yǔ)法,一個(gè)匿名函數(shù) console.log(value, "----", !!value, "----", value.type, "-----", value.data); return value && value.type === "Buffer" ? Buffer.from(value.data): value; // 只留下最后一個(gè)進(jìn)行轉(zhuǎn)換,前面的轉(zhuǎn)換全部被覆蓋 } ) // 輸出:console.log(copy);
PS C:UsersmingmDesktop est> node main.js {"type":"Buffer","data":[1,2,3,4,5]} Buffer ---- true ---- undefined ----- undefined 1 "----" true "----" undefined "-----" undefined 2 "----" true "----" undefined "-----" undefined 3 "----" true "----" undefined "-----" undefined 4 "----" true "----" undefined "-----" undefined 5 "----" true "----" undefined "-----" undefined [ 1, 2, 3, 4, 5 ] "----" true "----" undefined "-----" undefined { type: "Buffer", data: [ 1, 2, 3, 4, 5 ] } "----" true "----" "Buffer" "-----" [ 1, 2, 3, 4, 5 ]Buffer的合并PS C:UsersmingmDesktop est>
var buffer1 = Buffer.from("222"); var buffer2 = Buffer.from("3333"); var buffer3 = Buffer.concat([buffer1, buffer2]); console.log(buffer3.toString());Stream流
流為一個(gè)抽象的接口,
從流中讀取數(shù)據(jù)PS C:UsersmingmDesktop est> node main.js end! 33333333333333333333333333 PS C:UsersmingmDesktop est>
var fs = require("fs"); var data = ""; // 創(chuàng)建可讀流 var readerStream = fs.createReadStream("input.txt"); // 設(shè)置編碼為 utf8 readerStream.setEncoding("UTF8"); // 處理流事件 data事件 readerStream.on("data", (chunk) => {data += chunk;}); // 遇到數(shù)據(jù)讀取,將讀取到的內(nèi)容賦值給data // 處理流事件 end事件 readerStream.on("end", () => {console.log(data);}); // 將讀取到的保存到內(nèi)存中的數(shù)據(jù)打印出來(lái) // 處理事件 error readerStream.on("error", (err) => {console.log(err.stack);}); // 處理error事件,將錯(cuò)誤輸出,避免程序的運(yùn)行中斷 console.log("end!");寫(xiě)入流
PS C:UsersmingmDesktop est> node main.js 程序執(zhí)行完畢 寫(xiě)入完成 PS C:UsersmingmDesktop est>
var fs = require("fs"); var data = "這是一段示例"; // 創(chuàng)建一個(gè)可以寫(xiě)入的流,寫(xiě)入到文件output.txt中 var writerStream = fs.createWriteStream("output.txt"); // 使用 utf8 編碼寫(xiě)入數(shù)據(jù) writerStream.write(data, "UTF8"); // 標(biāo)記文件末尾 writerStream.end(); // 處理流事件 --> data, end, add error writerStream.on("finish", () => {console.log("寫(xiě)入完成");}); writerStream.on("error", () => {console.log(err.stack);}); console.log("程序執(zhí)行完畢");管道流
把兩個(gè)文件之間建立流,讓一個(gè)文件的數(shù)據(jù)流向另外一個(gè)文件
PS C:UsersmingmDesktop est> node main.js 程序執(zhí)行完畢 PS C:UsersmingmDesktop est>
var fs = require("fs"); // 創(chuàng)建一個(gè)可讀流 var readerStream = fs.createReadStream("input.txt"); // 創(chuàng)建一個(gè)可寫(xiě)流 var writerStream = fs.createWriteStream("output.txt"); // 管道讀寫(xiě)操作 // 將兩個(gè)流通過(guò)管道連接起來(lái) readerStream.pipe(writerStream); console.log("程序執(zhí)行完畢");
這里需要注意的是,由于流的影響,導(dǎo)致在操作的時(shí)候,會(huì)覆蓋掉要寫(xiě)入文件的內(nèi)容,原先的內(nèi)容會(huì)被覆蓋
鏈?zhǔn)搅?/b>PS C:UsersmingmDesktop est> node main.js 文件壓縮完成 PS C:UsersmingmDesktop est>
var fs = require("fs"); var zlib = require("zlib"); // 壓縮 input.txt文件為 input.txt.gz fs.createReadStream("input.txt") // 創(chuàng)建一個(gè)可讀流 .pipe(zlib.createGzip()) // 將創(chuàng)建的可寫(xiě)流和壓縮流連接 .pipe(fs.createWriteStream("input.txt.gz")); // 在創(chuàng)建可寫(xiě)流,將三個(gè)流連接到一起 console.log("文件壓縮完成");內(nèi)容未被覆蓋的寫(xiě)入
var fs = require("fs"); var read = fs.createReadStream("output.txt"); var write = fs.createWriteStream("input.txt"); read.pipe(write); console.log("執(zhí)行完畢");
具體詳細(xì),請(qǐng)查文檔
https://nodejs.org/api/fs.htm...
https://nodejs.org/api/fs.htm...
文檔寫(xiě)的很詳細(xì),后面的參數(shù)為一個(gè)對(duì)象,通過(guò)對(duì)象即可進(jìn)行修改
模塊之前已經(jīng)闡述過(guò)一部分,這里闡述服務(wù)器端的模塊
服務(wù)器端的模塊node中自帶了一個(gè)http模塊,在代碼中請(qǐng)求他,并將返回值賦值給本地變量。即本地變量變成了一個(gè)擁有所有http模塊所提供的公共方法的對(duì)象。
node中有四個(gè)模塊,(原生模塊和三種文件模塊)
原生模塊和文件模塊優(yōu)先級(jí)不同,都會(huì)優(yōu)先從文件模塊的緩存中加載以及存在的模塊
從原生模塊加載原生模塊的優(yōu)先級(jí)低于文件模塊緩存的優(yōu)先級(jí)。原生模塊也有緩存區(qū)
從文件加載這個(gè)上一篇以及闡述完成,不在闡述
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/96281.html
摘要:表示當(dāng)前正在執(zhí)行的腳本的文件名。默認(rèn)編碼為模式為,為回調(diào)函數(shù),回調(diào)函數(shù)只包含錯(cuò)誤信息參數(shù),在寫(xiě)入失敗時(shí)返回。參數(shù)使用說(shuō)明如下通過(guò)方法返回的文件描述符。 Node.js回調(diào) Node.js異步編程的直接體現(xiàn)就是回調(diào)。 阻塞代碼: const fs = require(fs); let data = fs.readFileSync(input.txt); console.log(data...
摘要:端輸入數(shù)據(jù)到端,對(duì)就是輸入流,得到的對(duì)象就是可讀流對(duì)就是輸出端得到的對(duì)象是可寫(xiě)流。在中,這四種流都是的實(shí)例,它們都有事件,可讀流具有監(jiān)聽(tīng)數(shù)據(jù)到來(lái)的事件等,可寫(xiě)流則具有監(jiān)聽(tīng)數(shù)據(jù)已傳給低層系統(tǒng)的事件等,和都同時(shí)實(shí)現(xiàn)了和的事件和接口。 原文地址在我的博客 node中的Buffer和Stream會(huì)給剛接觸Node的前端工程師們帶來(lái)困惑,原因是前端并沒(méi)有類(lèi)似概念(or 有我們也沒(méi)意識(shí)到)。然而,...
摘要:創(chuàng)建簡(jiǎn)單應(yīng)用使用指令來(lái)載入模塊創(chuàng)建服務(wù)器使用方法創(chuàng)建服務(wù)器,并使用方法綁定端口。全局安裝將安裝包放在下。的核心就是事件觸發(fā)與事件監(jiān)聽(tīng)器功能的封裝。通常我們用于從一個(gè)流中獲取數(shù)據(jù)并將數(shù)據(jù)傳遞到另外一個(gè)流中。壓縮文件為文件壓縮完成。 創(chuàng)建簡(jiǎn)單應(yīng)用 使用 require 指令來(lái)載入 http 模塊 var http = require(http); 創(chuàng)建服務(wù)器 使用 http.create...
摘要:簡(jiǎn)介項(xiàng)目命名為就是一個(gè)服務(wù)器單純開(kāi)發(fā)一個(gè)服務(wù)器的想法,變成構(gòu)建網(wǎng)絡(luò)應(yīng)用的一個(gè)基本框架發(fā)展為一個(gè)強(qiáng)制不共享任何資源的單線程,單進(jìn)程系統(tǒng)。單線程弱點(diǎn)無(wú)法利用多核錯(cuò)誤會(huì)引起整個(gè)應(yīng)用退出,應(yīng)用的健壯性大量計(jì)算占用導(dǎo)致無(wú)法繼續(xù)調(diào)用異步。 NodeJs簡(jiǎn)介 Ryan Dahl項(xiàng)目命名為:web.js 就是一個(gè)Web服務(wù)器.單純開(kāi)發(fā)一個(gè)Web服務(wù)器的想法,變成構(gòu)建網(wǎng)絡(luò)應(yīng)用的一個(gè)基本框架.Node發(fā)展...
摘要:這使我們的知道什么時(shí)候原始模塊被初始化,在初始化后執(zhí)行預(yù)初始化隊(duì)列的操作,之后清空預(yù)初始化隊(duì)列,再調(diào)用作為參數(shù)的回調(diào)函數(shù),以下為具體步驟把賦值給,表示預(yù)初始化已經(jīng)完成了。 本系列文章為《Node.js Design Patterns Second Edition》的原文翻譯和讀書(shū)筆記,在GitHub連載更新,同步翻譯版鏈接。 歡迎關(guān)注我的專(zhuān)欄,之后的博文將在專(zhuān)欄同步: Encount...
閱讀 1718·2023-04-26 02:03
閱讀 5151·2021-11-22 13:53
閱讀 4871·2021-09-09 11:40
閱讀 4089·2021-09-09 09:34
閱讀 2270·2019-08-30 13:18
閱讀 3663·2019-08-30 11:25
閱讀 3417·2019-08-26 14:06
閱讀 2674·2019-08-26 13:52