久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

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

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

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

      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ù)竭_隊列開頭,這個結(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ù)組成,事件名是一個字符串,通常表達一定的語義。對于每個事件,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 提供了多個屬性,如 onemiton 函數(shù)用于綁定事件函數(shù),emit 屬性用于觸發(fā)一個事件。

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