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方法也可以将参数进行处理后再抛出
}))