美文网首页让前端飞
eventProxy 解决回调坑 (Node.js)

eventProxy 解决回调坑 (Node.js)

作者: _Wake | 来源:发表于2016-12-03 11:56 被阅读231次

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

    相关文章

      网友评论

        本文标题:eventProxy 解决回调坑 (Node.js)

        本文链接:https://www.haomeiwen.com/subject/soqcmttx.html