天天看點

EventProxy流程控制EventProxy流程控制 1、異步協作 all 2、重複異步協作 after

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