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

EventProxy流程控制的更多相关文章

  1. node中的流程控制中,co,thunkify为什么return callback()可以做到流程控制?

    前言 我在学习generator ,yield ,co,thunkify的时候,有许多费解的地方,经过了许多的实践,也慢慢学会用,慢慢的理解,前一阵子有个其他项目的同事过来我们项目组学习node,发现 ...

  2. 第10章 Shell编程(4)_流程控制

    5. 流程控制 5.1 if语句 (1)格式: 格式1 格式2 多分支if if [ 条件判断式 ];then #程序 else #程序 fi if [ 条件判断式 ] then #程序 else # ...

  3. Shell命令和流程控制

    Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字 ...

  4. PHP基础知识之流程控制的替代语法

    PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch. 替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,e ...

  5. Python黑帽编程2.4 流程控制

    Python黑帽编程2.4  流程控制 本节要介绍的是Python编程中和流程控制有关的关键字和相关内容. 2.4.1 if …..else 先上一段代码: #!/usr/bin/python # - ...

  6. 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...

  7. [Java入门笔记] Java语言基础(四):流程控制

    流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下几种: 顺序结构 顺序结构,顾名思义,是指程序从上往下逐步顺序执行.中间没有任何的判断和跳转. 分支结构 Java提供两种分支结构: ...

  8. node基础13:异步流程控制

    1.流程控制 因为在node中大部分的api都是异步的,比如说读取文件,如果采用回调函数的形式,很容易造成地狱回调,代码非常不容易进行维护. 因此,为了解决这个问题,有大神写了async这个中间件.极 ...

  9. Shell入门教程:流程控制(1)命令的结束状态

    在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环 ...

随机推荐

  1. ASP.NET Core 2 学习笔记(五)静态文件

    之前的ASP.NET网站,只要把*.html.*.css.*.jpg.*.png.*.js等静态文件放在项目根目录,默认都可以直接被浏览:但ASP.NET Core 小改了浏览静态文件的方式,默认根目 ...

  2. ASP.NET webform多次提交表单问题

    最近几天遇到一个头疼的问题,项目采用的是webform开发,每个界面都有个提交按钮,点击多次提交按钮导致提交按钮的OnClick事件执行了多次, 每次OnClick里面都有一些逻辑处理,执行了多次导致 ...

  3. odoo:开源ERP/安装和初始设置

    1.1 Odoo的结构 Odoo使用Web浏览器来访问Odoo服务,因此你的Odoo服务器可以部署在较远的地方(如另外一个城市),用户的计算机上只需安装谷歌.火狐或 IE9 以上的浏览器,所以Web客 ...

  4. FTP 作业整理

    一.FTP 客户端 与服务器端(没有解决黏包问题的代码) 服务器端设置 import socket import json ADDR = () sk =socket.socket() sk.bind( ...

  5. Redis的认识和基本操作

    Redis是什么 Redis 是一个高性能的开源的.C语言写的Nosql(非关系型数据库),数据保存在内存中. Redis 是以key-value形式存储的Nosql,和传统的关系型数据库不一样.不一 ...

  6. jsp的九大内置对象(查询资料,搬砖所得)

    此笔记大部分摘自大神https://www.cnblogs.com/SimonHu1993/,部分通过网上搜寻补充. 1.Request内置对象(类型:HttpServletRequest    表示 ...

  7. method swizzing

    原理 类的方法类别中,选择子的名称通过映射表找到应该调用的方法.如下所示:  OC 的运行时提供了几个方法可以操作这张表.可以向其中新增选择子,改变选择子的实现,或者交换选择子映射到的指针.  在 ...

  8. centos7启动顺序加密的问题

    在上一篇博客中我们说的是如何进入单用户模式,这篇我主要来讲centos7启动加密. 首先我们来说centos的启动顺序: 上一篇我们所说的进入单用户模式,就是在boot loader 这一层次下进入的 ...

  9. UML入门 之 交互图 -- 时序图 协作图详解

    作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/17927131 动态图概念 : 从静态图中抽取瞬间值的变化描 ...

  10. java异常层次机构图

    以下内容转自:http://www.cnblogs.com/toSeeMyDream/p/5213610.html 在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中.下面的 ...