让前端飞

eventProxy 解决回调坑 (Node.js)

2016-12-03  本文已影响231人  _Wake

EventProxy 仅仅是一个很轻量的工具,但是能够带来一种事件式编程的思维变化。有几个特点:
• 利用事件机制解耦复杂业务逻辑
• 移除被广为诟病的深度callback嵌套问题
• 将串行等待变成并行等待,提升多异步协作场景下的执行效率
• 友好的Error handling
• 无平台依赖,适合前后端,能用于浏览器和Node.js
• 兼容CMD,AMD以及CommonJS模块环境

安装:
npm install eventproxy
示例代码:

var fs = require('fs');
var EventProxy = require('eventProxy';)

var ep = new EventProxy();

// 一般回调方法,读取3个文本文档的内容
fs.readFile('./fileOne.txt', 'utf8', function(err, content1) {
    fs.readFile('./fileTwo.txt', 'utf8', function(err, content2) {
        fs.readFile('./fileThree.txt', 'utf8', function(err, content3) {
            console.log(content1 + content2 + content3);
        });  
    });  
});

一、解决回调 - all 方法监听:

ep.all(['read_file1', 'read_file2', 'read_file3'], function(content1, content2, content3){
    console.log(content1 + content2 + content3);
});

// emit方法:抛出事件
fs.readFile('./file1.txt', 'utf8', function(err, content1){
    ep.emit('read_file1', content1);    // 事件名称 + 参数
});
fs.readFile('./file1.txt', 'utf8', function(err, content2){
    ep.emit('read_file2', content2);
});
fs.readFile('./file1.txt', 'utf8', function(err, content3){
    ep.emit('read_file3', content3);
});

二、解决回调 - after 方法监听:

/**
* 监听一定次数后,执行匿名函数
* @param string 监听的事件名称
* @param int 监听事件的次数
*/
ep.after('red_file', 3, function(contents) {   
    console.log(contents.join());    
})

// emit方法:抛出事件
fs.readFile('./file1.txt', 'utf8', function(err, content1){
    ep.emit('read_file', content1);    // 此次抛出的事件名称相同
});
fs.readFile('./file1.txt', 'utf8', function(err, content2){
    ep.emit('read_file', content2);
});
fs.readFile('./file1.txt', 'utf8', function(err, content3){
    ep.emit('read_file', content3);
});

三、优化代码 - fail 监听错误

ep.fail(function(err){
    console.log(err);
});
fs.readFile('./file4.txt', 'utf8', function(err, content){
    if (err) {
        ep.emit('error', err);
    }
})

四、优化代码 - throw 抛出错误

fs.readFile('./file4.txt', 'utf8', function(err, content){
    if (err) {
        ep.throw(err);  //会直接 log出错误,效果等同与 fail监听,并省略之 
    }
})

五、优化代码 - done 再次简化

ep.after('read_file', 1, function(contents){
    console.log(contents.join());
});
fs.readFile('./file1.txt', 'utf8', ep.done('read_file'))     //省略匿名函数,直接抛出事件名与参数
ep.after('read_file', 1, function(contents){
    console.log(contents.join());
});
fs.readFile('./file1.txt', 'utf8', ep.done('read_file', function(content) {
    return content + 'abc';           // done方法也可以将参数进行处理后再抛出
})) 
上一篇下一篇

猜你喜欢

热点阅读