站長資訊網
        最全最豐富的資訊網站

        聊聊Node.js中的事件驅動程序和EventEmitter類

        本篇文章帶大家了解一下Node中的事件,聊聊一下事件驅動程序和EventEmitter 類,希望對大家有所幫助!

        聊聊Node.js中的事件驅動程序和EventEmitter類

        Nodejs 是單進程單線程應用程序,但是因為 V8 引擎提供的異步執行回調接口,通過這些接口可以處理大量的并發,所以性能非常高。

        Node.js 幾乎每一個 API 都是支持回調函數的。

        Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現。

        Node.js 單線程類似進入一個while(true)的事件循環,直到沒有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發生就調用該回調函數。


        事件驅動程序

        Node.js 使用事件驅動模型,當web server接收到請求,就把它關閉然后進行處理,然后去服務下一個web請求。

        當這個請求完成,它被放回處理隊列,當到達隊列開頭,這個結果被返回給用戶。

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

        在事件驅動模型中,會生成一個主循環來監聽事件,當檢測到事件時觸發回調函數。

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

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

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

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

        我們可以通過程序觸發事件:

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

        實例

        創建 index.js 文件,代碼如下所示:

        //引入 fs 模塊 var fs = require("fs");  // 引入 events 模塊 var events = require('events');  // 創建對象 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);         // 觸發res事件         ee.emit('res',data);     } })

        接下來讓我們執行以上代碼:

        聊聊Node.js中的事件驅動程序和EventEmitter類

        EventEmitter 類

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

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

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

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

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

        //event.js 文件 var EventEmitter = require('events').EventEmitter;  var event = new EventEmitter();  event.on('some_event', function() {      console.log('some_event 事件觸發');  });  setTimeout(function() {      event.emit('some_event');  }, 1000);

        執行結果如下:

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

        $ node event.js  some_event 事件觸發

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

        當事件觸發時,注冊到這個事件的事件監聽器被依次調用,事件參數作為回調函數參數傳遞。

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

        //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 參數', 'arg2 參數');

        執行以上代碼,運行的結果如下:

        $ node event.js  listener1 arg1 參數 arg2 參數 listener2 arg1 參數 arg2 參數

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

        運行結果中可以看到兩個事件監聽器回調函數被先后調用。 這就是EventEmitter最簡單的用法。

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

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 日本熟妇亚洲欧美精品区| 亚欧乱色国产精品免费视频| 国产精品美女久久久免费| 亚洲精品无码久久久影院相关影片| 久久国产精品久久| 无码国内精品久久人妻蜜桃| 国产亚洲精品AA片在线观看不加载| 国产精品国产三级国产av品爱网| 四虎永久在线精品国产馆V视影院| 欧美精品一区二区三区视频| 日韩精品久久久肉伦网站| 精品99又大又爽又硬少妇毛片| 精品国产美女福利到在线不卡| 欧美日韩人妻精品一区二区在线| 精品午夜福利1000在线观看| 久久国产乱子伦精品免费强| 国产亚洲精品岁国产微拍精品| 亚洲色精品aⅴ一区区三区| 久久国产精品国语对白| 国产精品成人国产乱一区| 精品一区二区久久| 97久久超碰国产精品旧版| 色久综合网精品一区二区| 亚洲午夜成人精品电影在线观看| 久久精品中文字幕有码| 国产精品成人观看视频| 98香蕉草草视频在线精品看| 国产91精品在线| 成人无码精品1区2区3区免费看| 久久丫精品国产亚洲av不卡| 一区二区国产精品 | 国精品无码A区一区二区| 99久免费精品视频在线观看| 亚洲精品自产拍在线观看动漫| 国产精品视频网站你懂得| 国产精品99精品久久免费| 国产成人精品手机在线观看| 国产精品视频一区二区三区四 | 无码日韩精品一区二区免费| 中文精品99久久国产| 亚洲欧洲自拍拍偷精品 美利坚|