eventProxy 解决回调坑 (Node.js)

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方法也可以将参数进行处理后再抛出
})) 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • # 模块机制 node采用模块化结构,按照CommonJS规范定义和使用模块,模块与文件是一一对应关系,即加载一个...
    RichRand阅读 2,556评论 0 3
  • 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined、Nul...
    极乐君阅读 5,603评论 0 106
  • 本文是eventproxy的readme,只是方便我自己偶尔看看的, 这个世界上不存在所谓回调函数深度嵌套的问题。...
    LuciferTM阅读 5,037评论 0 2
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宫若石阅读 1,126评论 0 1
  • 错失光阴真是一件可恨的事。回想起自己三年多来的转辗,有时真是觉得不应该。从没有在任何一个地方好好沉淀下来。不是去干...
    更向远行阅读 372评论 2 1