Node.js原理阻塞和EventEmitter及其繼承的運用實戰(zhàn)
基本概念
簡單地說,Node.js是在服務(wù)器端運行的JavaScript。 節(jié)點。
$ node
> console.log('Hello 黎燃!');
Hello 黎燃!然而,對于node JS,概念完全不同。
使用node JS,我們不僅實現(xiàn)了一個應(yīng)用程序,還實現(xiàn)了整個HTTP服務(wù)器。
事實上,我們的web應(yīng)用程序和相應(yīng)的web服務(wù)器基本相同。 讓我們了解一下node JS應(yīng)用程序由以下部分組成: 1.介紹所需模塊:我們可以使用require命令加載node JS模塊。 2.創(chuàng)建服務(wù)器:服務(wù)器可以監(jiān)聽客戶端的請求,類似于Apache和nginx等HTTP服務(wù)器。 3.接收請求并響應(yīng)請求的服務(wù)器很容易創(chuàng)建??蛻舳丝梢允褂脼g覽器或終端發(fā)送HTTP請求,服務(wù)器收到請求后返回響應(yīng)數(shù)據(jù)。
回調(diào)函數(shù)
Node.jsS異步編程的直接體現(xiàn)是回調(diào)。
阻塞代碼
異步編程依賴于回調(diào),但不能說在使用回調(diào)后程序?qū)⑹钱惒降摹?完成任務(wù)后將調(diào)用回調(diào)函數(shù)。節(jié)點使用大量回調(diào)函數(shù)。 節(jié)點的所有API都支持回調(diào)函數(shù)。
讀取文件后,我們返回文件內(nèi)容作為回調(diào)函數(shù)的參數(shù)。 這樣,在執(zhí)行代碼時就不會阻塞或等待文件I/O操作。
回調(diào)函數(shù)通常顯示為函數(shù)的最后一個參數(shù):
function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }創(chuàng)建主JS文件,代碼如下:
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程序執(zhí)行結(jié)束!");非阻塞代碼
創(chuàng)建主JS文件,代碼如下:
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序執(zhí)行結(jié)束!");在以上兩個例子中,我們理解阻塞調(diào)用和非阻塞調(diào)用之間的區(qū)別。第一個實例在讀取文件后執(zhí)行程序。 在第二個示例中,我們不需要等待文件被讀取,因此我們可以在讀取文件的同時執(zhí)行以下代碼,這大大提高了程序的性能。
因此,按順序執(zhí)行阻塞,不需要按順序執(zhí)行非阻塞。
Node.js 事件循環(huán)

Node.js使用事件驅(qū)動模型。 當web服務(wù)器接收到一個請求時,它會關(guān)閉并處理該請求,然后為下一個web請求提供服務(wù)。 當請求完成時,它將被放回處理隊列。當它到達隊列的開頭時,結(jié)果將返回給用戶。 引入 events 模塊
var events = require('events');創(chuàng)建 eventEmitter 對象
var eventEmitter = new events.EventEmitter();
綁定事件及事件的處理程序
eventEmitter.on('eventName', eventHandler);觸發(fā)事件
eventEmitter.emit('eventName');Node 應(yīng)用程序工作原理
創(chuàng)建主JS文件,代碼如下:
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err){
console.log(err.stack);
return;
}
console.log(data.toString());
});
console.log("程序執(zhí)行完畢");在上述程序中,F(xiàn)S Readfile()是一個用于讀取文件的異步函數(shù)。如果在讀取文件期間發(fā)生錯誤,error err對象將輸出錯誤消息。
程序執(zhí)行完畢
如果沒有發(fā)生錯誤,readfile將跳過err對象的輸出,并通過回調(diào)函數(shù)輸出文件內(nèi)容。
接下來,我們刪除輸入Txt文件。
執(zhí)行結(jié)果如下:
程序執(zhí)行完畢 Error: ENOENT, open 'input.txt'
EventEmitter 類
每次有新連接時,服務(wù)器對象的net將觸發(fā)事件,而readstream對象的FS將在文件打開時觸發(fā)事件。所有生成事件的對象都是EventEmitter實例中的事件。
引入 events 模塊
var events = require('events');創(chuàng)建 eventEmitter 對象
var eventEmitter = new events.EventEmitter();
如果在實例化EventEmitter對象期間發(fā)生錯誤,將觸發(fā)錯誤事件。添加新偵聽器時,將觸發(fā)newlistener事件。刪除偵聽器時,將觸發(fā)RemovelListener事件。
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
event.on('some_event', function() {
console.log('some_event 事件觸發(fā)');
});
setTimeout(function() {
event.emit('some_event');
}, 1000); 運行此代碼,控制臺在1秒_事件觸發(fā)器后輸出'some'。 觸發(fā)事件時,將依次調(diào)用注冊到此事件的事件偵聽器,并將事件參數(shù)作為回調(diào)函數(shù)參數(shù)傳遞。
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
}); on(event, listener)
注冊指定事件的偵聽器,并接受字符串事件和回調(diào)函數(shù)。
server.on('connection', function (stream) {
console.log('someone connected!');
});繼承 EventEmitter
大多數(shù)時候,我們不直接使用EventEmitter,而是在對象中繼承它。 所有支持事件響應(yīng)的核心模塊,包括FS、net和HTTP,都是EventEmitter的子類。
- 1.首先,具有實體函數(shù)的對象實現(xiàn)了符合語義的事件。事件的偵聽和發(fā)生應(yīng)該是對象的一種方法。
- 2.其次,JavaScript的對象機制是基于原型的,支持部分多重繼承。繼承EventEmitter不會干擾對象的原始繼承關(guān)系。
到此這篇關(guān)于Node.js原理對于阻塞和EventEmitter及其繼承的運用實戰(zhàn)的文章就介紹到這了,更多相關(guān)Node.js EventEmitter 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js + express實現(xiàn)上傳大文件的方法分析【圖片、文本文件】
這篇文章主要介紹了Node.js + express實現(xiàn)上傳大文件的方法,結(jié)合實例形式分析了Node.js + express針對圖片、文本文件上傳操作實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-03-03
使用GruntJS構(gòu)建Web程序之Tasks(任務(wù))篇
任務(wù)(Tasks)是grunt的核心概念,你所做的很多工作比如資源合并(concat)、壓縮(uglify)都是在配置任務(wù)。 每次grunt運行的時候,你指定的一個或多個任務(wù)也在運行,如果你沒有指定任務(wù),那么一個默認名為“default”的任務(wù)將自動運行。2014-06-06
Node.js中readline模塊實現(xiàn)終端輸入
本文主要介紹了Node.js中readline模塊實現(xiàn)終端輸入,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
Node.js?操作本地文件及深入了解fs內(nèi)置模塊
這篇文章主要介紹了Node.js?操作本地文件及深入了解fs內(nèi)置模塊,node.js作為服務(wù)端應(yīng)用,肯定少不了對本地文件的操作,像創(chuàng)建一個目錄、創(chuàng)建一個文件、讀取文件內(nèi)容等都是我們開發(fā)中經(jīng)常需要用到的功能2022-09-09

