Node.js原理阻塞和EventEmitter及其繼承的運用實戰(zhàn)
基本概念
簡單地說,Node.js是在服務器端運行的JavaScript。 節(jié)點。
$ node > console.log('Hello 黎燃!'); Hello 黎燃!
然而,對于node JS,概念完全不同。
使用node JS,我們不僅實現(xiàn)了一個應用程序,還實現(xiàn)了整個HTTP服務器。
事實上,我們的web應用程序和相應的web服務器基本相同。 讓我們了解一下node JS應用程序由以下部分組成: 1.介紹所需模塊:我們可以使用require命令加載node JS模塊。 2.創(chuàng)建服務器:服務器可以監(jiān)聽客戶端的請求,類似于Apache和nginx等HTTP服務器。 3.接收請求并響應請求的服務器很容易創(chuàng)建??蛻舳丝梢允褂脼g覽器或終端發(fā)送HTTP請求,服務器收到請求后返回響應數(shù)據(jù)。
回調函數(shù)
Node.jsS異步編程的直接體現(xiàn)是回調。
阻塞代碼
異步編程依賴于回調,但不能說在使用回調后程序將是異步的。 完成任務后將調用回調函數(shù)。節(jié)點使用大量回調函數(shù)。 節(jié)點的所有API都支持回調函數(shù)。
讀取文件后,我們返回文件內容作為回調函數(shù)的參數(shù)。 這樣,在執(zhí)行代碼時就不會阻塞或等待文件I/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í)行結束!");
非阻塞代碼
創(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í)行結束!");
在以上兩個例子中,我們理解阻塞調用和非阻塞調用之間的區(qū)別。第一個實例在讀取文件后執(zhí)行程序。 在第二個示例中,我們不需要等待文件被讀取,因此我們可以在讀取文件的同時執(zhí)行以下代碼,這大大提高了程序的性能。
因此,按順序執(zhí)行阻塞,不需要按順序執(zhí)行非阻塞。
Node.js 事件循環(huán)
Node.js使用事件驅動模型。 當web服務器接收到一個請求時,它會關閉并處理該請求,然后為下一個web請求提供服務。 當請求完成時,它將被放回處理隊列。當它到達隊列的開頭時,結果將返回給用戶。 引入 events 模塊
var events = require('events');
創(chuàng)建 eventEmitter 對象
var eventEmitter = new events.EventEmitter();
綁定事件及事件的處理程序
eventEmitter.on('eventName', eventHandler);
觸發(fā)事件
eventEmitter.emit('eventName');
Node 應用程序工作原理
創(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對象的輸出,并通過回調函數(shù)輸出文件內容。
接下來,我們刪除輸入Txt文件。
執(zhí)行結果如下:
程序執(zhí)行完畢 Error: ENOENT, open 'input.txt'
EventEmitter 類
每次有新連接時,服務器對象的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ā)事件時,將依次調用注冊到此事件的事件偵聽器,并將事件參數(shù)作為回調函數(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)
注冊指定事件的偵聽器,并接受字符串事件和回調函數(shù)。
server.on('connection', function (stream) { console.log('someone connected!'); });
繼承 EventEmitter
大多數(shù)時候,我們不直接使用EventEmitter,而是在對象中繼承它。 所有支持事件響應的核心模塊,包括FS、net和HTTP,都是EventEmitter的子類。
- 1.首先,具有實體函數(shù)的對象實現(xiàn)了符合語義的事件。事件的偵聽和發(fā)生應該是對象的一種方法。
- 2.其次,JavaScript的對象機制是基于原型的,支持部分多重繼承。繼承EventEmitter不會干擾對象的原始繼承關系。
到此這篇關于Node.js原理對于阻塞和EventEmitter及其繼承的運用實戰(zhàn)的文章就介紹到這了,更多相關Node.js EventEmitter 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Node.js 8 中的 util.promisify的詳解
本篇文章主要介紹了Node.js 8 中的 util.promisify的詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06node終端里如何連接mysql數(shù)據(jù)庫并進行sql查詢
這篇文章主要為大家介紹了node終端里如何連接mysql數(shù)據(jù)庫并進行sql查詢,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07Nodejs實戰(zhàn)心得之eventproxy模塊控制并發(fā)
本篇文章給大家分享我的nodejs實戰(zhàn)心得,如何使用eventproxy模塊控制并發(fā),感興趣的朋友可以參考下2015-10-10利用Chrome DevTools直接調試Node.js和JavaScript的方法詳解(并行)
現(xiàn)在我們可以用瀏覽器調試node.js了!!!下面這篇文章主要介紹了利用Chrome DevTools直接調試Node.js和JavaScript的方法步驟,文中介紹的很詳細,需要的朋友可以參考學習,下面來一起看看吧。2017-02-02