欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(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)接口,通過這些接口可以處理大量的并發(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)來監(jiān)聽事件,當(dāng)檢測(cè)到事件時(shí)觸發(fā)回調(diào)函數(shù)。

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

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

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

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

          我們可以通過程序觸發(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);     } })

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

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

          EventEmitter 類

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

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

          // 引入 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)單的例子說明 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)聽器,然后我們通過 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á)一定的語義。對(duì)于每個(gè)事件,EventEmitter 支持 若干個(gè)事件監(jiān)聽器。

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

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

          //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)