亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    聊聊Node.js中的事件驅(qū)動(dòng)程序和EventEmitter類

    本篇文章帶大家了解一下Node中的事件,聊聊一下事件驅(qū)動(dòng)程序和EventEmitter 類,希望對(duì)大家有所幫助!

    聊聊Node.js中的事件驅(qū)動(dòng)程序和EventEmitter類

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

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

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

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


    事件驅(qū)動(dòng)程序

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

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

    這個(gè)模型非常高效可擴(kuò)展性非常強(qiáng),因?yàn)?webserver 一直接受請(qǐng)求而不等待任何讀寫操作。(這也稱之為非阻塞式IO或者事件驅(qū)動(dòng)IO)

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

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

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

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

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

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

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

    實(shí)例

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

    //引入 fs 模塊 var fs = require("fs");  // 引入 events 模塊 var events = require('events');  // 創(chuàng)建對(duì)象 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("讀取出錯(cuò):"+err);     }else{         console.log("讀取成功:"+data);         // 觸發(fā)res事件         ee.emit('res',data);     } })

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

    聊聊Node.js中的事件驅(qū)動(dòng)程序和EventEmitter類

    EventEmitter 類

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

    你可以通過(guò)require("events");來(lái)訪問(wèn)該模塊。

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

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

    下面我們用一個(gè)簡(jiǎn)單的例子說(shuō)明 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é)果如下:

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

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

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

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

    讓我們以下面的例子解釋這個(gè)過(guò)程:

    //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í)行以上代碼,運(yùn)行的結(jié)果如下:

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

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

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

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

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)