Node.js:理解使用事件發射器模式簡化事件綁定
Node.js的核心是異步和回調,就是所說的事件驅動編程和函數回調。但是要是需要處理的事物是具有特定的順序的化,實現的時候需要使用遞歸來處理。CommonJS標準 每個模塊都由一個上下文將該模塊與其他模塊隔離
標準的回調模式:
(CPS Continuation-passing style):后繼傳遞風格
異步編程風格是一種程序的流程控制權以后繼的形式被顯式的傳遞的編程風格。
按后繼傳遞風格編寫的函數以一個顯式的"后繼"作為額外的參數,"后繼"實際
上是一個函數,當CPS函數計算出返回值時,它就調用后繼函數,并將 CPS
函數的返回值作為參數。這種模式能夠很好的處理函數執行結束后需要通知客戶端的情況。
var fs = require('fs');
fs.readFile('/etc/passwd',function(err,fileContent){
if(err){
throw err;
}
console.log("fileContent " + fileContent.toString());
});
//回調函數第一個參數是一個錯誤對象,如果有錯誤發生,這個參數就是Error的一個實例,這就是比Node中的應用CPS編程的一般模式。
理解事件發射器模式:
事件發射器:可以發射事件的對象。
事件監聽器:綁定到事件發射器上的代碼,負責監聽特定類型的事件。
理解事件類型:
發射的事件具有一定的類型,類型用一個字符串表示如"data","end","on" 等,他們都是由事件發射器定義的任意字符串。當你使用到API時
應該會有對應的文檔記錄他能夠發射的事件類型。 一旦有事件發生,事件發射器就會調用相應的事件監聽器,并將相關數據作為參數傳遞給事件監聽器。
雖然事件發生器時服務任意類型事件的通用接口,但在Node的實現中有一個特例即error事件,Node中大多數事件發射器實現在程序發生錯誤時都會發射"error"事件,所以都要監聽這個錯誤事件,防止向上拋出異常。
應用事件發射器API:
任何實現了事件發射器模式的對象(例如:TCP http等)都實現了:
1:addListener 和on ->為指定的事件添加事件監聽器
2:once->為指定的事件添加只會調用一次的事件監聽器
3:removeEventListener ->刪除綁定到指定事件上的某個指定的事件監聽器。
4:removeAllEventListener ->刪除綁定到指定事件上的全部的事件監聽器。
允許綁定多個事件監聽器。根據事件類型,事件發射器負責按照事件所綁定的監聽器的注冊順序依次調用事件監聽器。這就意味著:
1:某個事件監聽器也許并不會在事件發射之后就立即被調用,也許在它之前還有別的事件監聽器被調用。
2:異常被拋出到堆棧并不正常,他通常時有代碼中的錯誤引起的。
創建事件發射器:
1:從Node事件發射器繼承
var util = require('util');
var eventEmitter = require('events').EventEmitter;
var myClass = function(){}
util.inherits(myClass,eventEmitter);//util.inherits建立了一條原型鏈,使myClass類實例能夠使用EventEmitter的原型方法