EventProxy流程控制
EventProxy是一個通過控制事件觸發順序來控制業務流程的工具。
1. 利用事件機制解耦複雜業務邏輯
2. 移除被廣為诟病的深度callback嵌套問題
3. 将串行等待變成并行等待,提升多異步協作場景下的執行效率
4. 友好的Error handling
node.js的亮點是回調函數,node.js流程控制、傳參都是通過回調函數來實作的。開發中經常會遇到回調嵌套的場景,尤其是在業務複雜的場景下,會嵌套n層回調函數,這樣做的原因是為了控制代碼執行的流程。
下面是一個需要同步讀取檔案的例子
var str = '';
fs.readFile('file1.txt', function(err, data1) {
str += data1;
fs.readFile('file2.txt', function(err, data2) {
str += data2;
fs.readFile('file3.txt', function(err, data3) {
str += data3;
});
});
});
上面代碼有3層回調嵌套,用嵌套來保障檔案的順序讀取。這樣代碼可讀性就比較差了,而開發中用到的嵌套往往有很多層,代碼很難讀。
我們用EventProxy來解耦
安裝:npm install eventproxy
引包:var EventProxy = require('eventproxy');
var ep = new EventProxy();
1、異步協作 all
多個操作并行執行,每個操作完成後觸發一個自定義事件.ep.all監聽所有操作觸發的事件,然後在回調函數裡面提供各事件提供的結果
ep.all('read1', 'read2', 'read3', function(data1, data2, data3) {
//監聽事件,所有事件都觸發完成後,在這裡彙總結果
console.info(data1 + '~' + data2 + '~' + data3);
});
fs.readFile('file1.txt', function(err, data1) {
ep.emit('read1', data1);//觸發事件
});
fs.readFile('file2.txt', function(err, data2) {
ep.emit('read2', data2);//觸發事件
});
fs.readFile('file3.txt', function(err, data3) {
ep.emit('read3', data3);//觸發事件
});
2、重複異步協作 after
`after`方法适合重複的操作,比如讀取10個檔案,調用5次資料庫等。将handler注冊到N次相同僚件的觸發上。達到指定的觸發數,handler将會被調用執行,每次觸發的資料,将會按觸發順序,存為數組作為參數傳入。
var files = ['file1.txt', 'file2.txt', 'file3.txt'];
ep.after('readfile', files.length, function(list) {
// 在所有檔案的異步執行結束後将被執行
// 所有檔案的内容都存在list數組中
//list中值是無序的,因為for循環中ep.emit觸發順序是無序的(node異步特點),排列順序取決于node事件觸發的順序。可以通過group來控制對應關系,後續講。
});
for (var i = 0; i < files.length; i++) {
fs.readFile(files[i], function(err, data) {
// 觸發結果事件
ep.emit('readfile', data);
});
}
注意:如果ep.emit('你的事件名稱') 的次數沒有達到after中次數(第二個參數),是無法觸發after的回調函數的,這裡一定要注意!
參考:https://blog.csdn.net/shmnh/article/details/43866677