zoukankan      html  css  js  c++  java
  • EventProxy流程控制

    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

  • 相关阅读:
    JavaScript--微博发布效果
    JavaScript--模拟百度搜索下拉li
    JavaScript--for in循环访问属性用"."和[ ]的区别
    JavaScript--函数中()的作用
    JavaScript--时间日期格式化封装
    【网络】Vmware虚拟机下三种网络模式配置
    【IP】DHCP介绍
    【Shell】ps -ef 和ps aux
    【基础】Pipeline
    【时间】Unix时间戳
  • 原文地址:https://www.cnblogs.com/1906859953Lucas/p/9646078.html
Copyright © 2011-2022 走看看