成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Node.js中事件驅(qū)動程序和EventEmitter類有什么用

這篇文章將為大家詳細(xì)講解有關(guān)Node.js中事件驅(qū)動程序和EventEmitter類有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司作為成都網(wǎng)站建設(shè)公司,專注重慶網(wǎng)站建設(shè)公司、網(wǎng)站設(shè)計,有關(guān)成都企業(yè)網(wǎng)站建設(shè)方案、改版、費用等問題,行業(yè)涉及成都公路鉆孔機等多個領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。

Nodejs 是單進程單線程應(yīng)用程序,但是因為 V8 引擎提供的異步執(zhí)行回調(diào)接口,通過這些接口可以處理大量的并發(fā),所以性能非常高。

Node.js 幾乎每一個 API 都是支持回調(diào)函數(shù)的。

Node.js 基本上所有的事件機制都是用設(shè)計模式中觀察者模式實現(xiàn)。

Node.js 單線程類似進入一個while(true)的事件循環(huán),直到?jīng)]有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發(fā)生就調(diào)用該回調(diào)函數(shù)。


事件驅(qū)動程序

Node.js 使用事件驅(qū)動模型,當(dāng)web server接收到請求,就把它關(guān)閉然后進行處理,然后去服務(wù)下一個web請求。

當(dāng)這個請求完成,它被放回處理隊列,當(dāng)?shù)竭_(dá)隊列開頭,這個結(jié)果被返回給用戶。

這個模型非常高效可擴展性非常強,因為 webserver 一直接受請求而不等待任何讀寫操作。(這也稱之為非阻塞式IO或者事件驅(qū)動IO)

在事件驅(qū)動模型中,會生成一個主循環(huán)來監(jiān)聽事件,當(dāng)檢測到事件時觸發(fā)回調(diào)函數(shù)。

Node.js 有多個內(nèi)置的事件,我們可以通過引入 events 模塊,并通過實例化 EventEmitter 類來綁定和監(jiān)聽事件,如下實例:

// 引入 events 模塊
var events = require('events');
// 創(chuàng)建 eventEmitter 對象
var eventEmitter = new events.EventEmitter();

以下程序綁定事件處理程序:

// 綁定事件及事件的處理程序
eventEmitter.on('eventName', eventHandler);

我們可以通過程序觸發(fā)事件:

// 觸發(fā)事件
eventEmitter.emit('eventName');

實例

創(chuàng)建 index.js 文件,代碼如下所示:

//引入 fs 模塊
var fs = require("fs");

// 引入 events 模塊
var events = require('events');

// 創(chuàng)建對象
var ee = new events.EventEmitter();

// 綁定事件及事件的處理程序
ee.on('res', function (data) {
    console.log('res-1');
    console.log(data);
});
ee.on('res', function () {
    console.log('res-2');
});

fs.readFile('hello.txt',{flag:'r',encoding:'utf-8'},function(err,data){
    if(err){
        console.log("讀取出錯:"+err);
    }else{
        console.log("讀取成功:"+data);
        // 觸發(fā)res事件
        ee.emit('res',data);
    }
})

接下來讓我們執(zhí)行以上代碼:

Node.js中事件驅(qū)動程序和EventEmitter類有什么用

EventEmitter 類

events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就是事件觸發(fā)與事件監(jiān)聽器功能的封裝。

你可以通過require("events");來訪問該模塊。

// 引入 events 模塊
var events = require('events');
// 創(chuàng)建 eventEmitter 對象
var eventEmitter = new events.EventEmitter();

EventEmitter 對象如果在實例化時發(fā)生錯誤,會觸發(fā) error 事件。當(dāng)添加新的監(jiān)聽器時,newListener 事件會觸發(fā),當(dāng)監(jiān)聽器被移除時,removeListener 事件被觸發(fā)。

下面我們用一個簡單的例子說明 EventEmitter 的用法:

//event.js 文件
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);

執(zhí)行結(jié)果如下:

運行這段代碼,1 秒后控制臺輸出了 'some_event 事件觸發(fā)'。其原理是 event 對象注冊了事件 some_event 的一個監(jiān)聽器,然后我們通過 setTimeout 在 1000 毫秒以后向 event 對象發(fā)送事件 some_event,此時會調(diào)用some_event 的監(jiān)聽器。

$ node event.js 
some_event 事件觸發(fā)

EventEmitter 的每個事件由一個事件名和若干個參數(shù)組成,事件名是一個字符串,通常表達(dá)一定的語義。對于每個事件,EventEmitter 支持 若干個事件監(jiān)聽器。

當(dāng)事件觸發(fā)時,注冊到這個事件的事件監(jiān)聽器被依次調(diào)用,事件參數(shù)作為回調(diào)函數(shù)參數(shù)傳遞。

讓我們以下面的例子解釋這個過程:

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 參數(shù)', 'arg2 參數(shù)');

執(zhí)行以上代碼,運行的結(jié)果如下:

$ node event.js 
listener1 arg1 參數(shù) arg2 參數(shù)
listener2 arg1 參數(shù) arg2 參數(shù)

以上例子中,emitter 為事件 someEvent 注冊了兩個事件監(jiān)聽器,然后觸發(fā)了 someEvent 事件。

運行結(jié)果中可以看到兩個事件監(jiān)聽器回調(diào)函數(shù)被先后調(diào)用。 這就是EventEmitter最簡單的用法。

EventEmitter 提供了多個屬性,如 onemit。on函數(shù)用于綁定事件函數(shù),emit屬性用于觸發(fā)一個事件。

關(guān)于“Node.js中事件驅(qū)動程序和EventEmitter類有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

文章題目:Node.js中事件驅(qū)動程序和EventEmitter類有什么用
網(wǎng)頁鏈接:http://jinyejixie.com/article10/ppiogo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站改版網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計公司網(wǎng)站策劃、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)
定远县| 临江市| 永平县| 吉安县| 平顺县| 常宁市| 洛南县| 二手房| 唐山市| 鄂伦春自治旗| 达日县| 清水河县| 成都市| 永川市| 海阳市| 巴彦县| 红桥区| 西华县| 武清区| 蒙山县| 西城区| 偃师市| 治多县| 尚志市| 长沙县| 固原市| 平定县| 梁山县| 平原县| 得荣县| 台江县| 张家川| 苏尼特右旗| 周至县| 通州区| 施秉县| 久治县| 贵定县| 广安市| 珠海市| 高青县|