js 异步流程控制之 avQ(avril.queue)
废话前言
写了多年的js,遇到过最蛋疼的事情莫过于callback hell, 相信大家也感同身受。
业界许多大大也为此提出了很多不错的解决方案,我所了解的主要有:
- 朴灵 event proxy, 简单明了容易上手
- 老赵的 wind.js, 写起来最舒坦,最能表达程序顺序执行逻辑
- Promise,个人感觉为解决一个坑引入另外一个坑,写出来的代码一大坨,代码可读性最差
我这人闲着没事也爱折腾,我也自己造轮子,不为别的只为自己代码写的舒服流畅.
传送门:目前只支持 node.js 环境,以后有时间再增加浏览器支持
- github https://github.com/flowforever/avril.queue
- npm install avril.queue
简介
为啥叫avQ: 全称是avril.queue因为哥喜欢avril就用她名字命名,跟岛国无关
核心:avQ作为一个异步流程控制框架包含两大要素来实现异步流程控制并且编码方便流畅
- queue 执行队列 确保程序逻辑按照顺序执行
- $AwaitData 异步等待数据对象,该对象可以作为参数用于下一步异步请求,实现编码流畅的核心
动手avQ
Basic example: q.func, q.$await, q.$each
var q = avQ();
var $fileContent = q.$await(fs.readFile, 'the/path/of/file.txt', function(err, res){ /*此时的this 并不是指向q,而是一个新的avQ()对象 所以this实际上就是一个subQueue, this.error()会将error层层上抛默认只上抛不做任何处理,以后章节我会详细介绍q.func执行的原理*/ this.error(err); return res; });
如果fs.readFile 需要上下文怎么办
q.$await, q.$each, 以及后面的q.$$await,q.$$each 都支持传入context作为第一个参数,例如
var $fileContent = q.$await(fs, fs.readFile, 'the/path/of/file.txt', function(err, res){
this.error(err);
return res;
});
var $$fileContent = q.$$await(fs, fs.readFile, 'the/path/of/file.txt'); // 会自动将 res 最为 $awaitData 的结果
var $fileExisted = q.$await(fs.exists, 'the/path/of/file.txt'); // 默认将返回fs.existe 的 callback(existed) 中第一个参existed 数作为值
var avQ = require('avril.queue');
var q = avQ();
/* return $AwaitData object */
var $fileContent = q.$await(fs.readFile, 'the/path/of/file.txt'
, function(err, fileContent){
this.error(err);
return fileContent;
});
/* convert the $awaitData' result , return a new $AwaitData object */
var $ids = $fileContent.convert(function($org){
return $org.result().split('\n');
});
/* return $AwaitData object which result is list of */
var $users = q.$each(db.User.findById, $ids, function(err, user){
this.error(err);
return user;
});
q.func(function(){
console.log( $fileContent.result() )
console.log( $users.realResult() );
});
Syntax Sugar: q.$$await, q.$$each,
q.$if($awaitData, trueFunc), q.$if($awaitData, trueFunc).$else(), q.$if($awaitData, trueFunc).$elseIf($otherAwaitData, otherTrueFunc)
对于标准的node.js异步调用一般返回值是callback(err, result),
var $fileContent = q.$$await(fs.readFile, 'the/path/of/file.txt'); // 跟$await() 的区别在于$await 最后一个参数需要callback: return res;
$fileContent在异步请求完毕之后将会自动使用result 作为结果.
var avQ = require('avril.queue');
var q = avQ();
var $fileContent, $ids, $users;
/* return $AwaitData object */
var filePath1 = 'the/path/of/file1.txt';
var filePath2 = 'the/path/of/file2.txt';
var $fileExisted = q.$await(fs.exists, filePath1);
q.$if($fileExisted, function(){
$fileContent = this.$$await(fs.readFile, filePath1);
}).$else(function(){
$fileContent = this.$$await(fs.readFile, filePath2);
});
q.func(function(){
/* convert the $awaitData' result , return a new $AwaitData object */
$ids = $fileContent.convert(function($org){
return $org.result().split('\n');
});
/* return $AwaitData object which result is list of */
$users = this.$$each(db.User.findById, $ids);
});
q.func(function(){
console.log( $fileContent.result() ) //只取出第一级 result()
console.log( $users.realResult() ); // 递归取出所有的result()
});
小结
人无完人,码无完码,欢迎大家拍砖,如果大家有兴趣我会继续推出更多api文档及介绍(大家没兴趣还是要继续写完整,哈哈).
大家要觉得我这个库有意思不妨给个github start
js 异步流程控制之 avQ(avril.queue)的更多相关文章
- js异步流程控制-回调
f1为耗时操作,f2依赖f1的数据,因此f2必须在f1之后执行: 个人理解是:将f2(回调函数)的代码放在异步函数内部的最后执行,相当于把同步操作的代码融合到异步函数内部的最后: let tag = ...
- nodejs进阶(7)—async异步流程控制
Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 m ...
- 使用yield进行异步流程控制
现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...
- 异步流程控制库GoWithTheFlow
异步流程控制库GoWithTheFlow 一个尾触发方式来控制异步流程的库, 有seq(顺序执行) par(同步执行) 两种方法 博客 http://notes.jetienne.com/2011/0 ...
- 【javascript】Promise/A+ 规范简单实现 异步流程控制思想
——基于es6:Promise/A+ 规范简单实现 异步流程控制思想 前言: nodejs强大的异步处理能力使得它在服务器端大放异彩,基于它的应用不断的增加,但是异步随之带来的嵌套.难以理解的代码让 ...
- node核心:异步流程控制
Node.js的异步是整个学习Node.js过程中重中之重. 1)异步流程控制学习重点 2)Api写法:Error-first Callback 和 EventEmitter 3)中流砥柱:Promi ...
- Nodejs中使用异步流程控制Async
首先,我们都知道,Node基于事件驱动的异步I/O架构,所谓异步就是非阻塞,说白了就是一个事件执行了,我不必等待它执行完成后我才能执行下一个事件.所以在Node环境中的模块基本都是异步的,上一篇说到我 ...
- (一)Nodejs - 框架类库 - Nodejs异步流程控制Async
简介 Async是一个流程控制工具包,提供了直接而强大的异步功能 应用场景 业务流程逻辑复杂,适应异步编程,减少回调的嵌套 安装 npm insatll async 函数介绍 Collections ...
- async 异步流程控制规则
github 学习async网址 : https://github.com/caolan/async/ 1.Async 函数介绍 async 主要实现了三个部分的流程控制功能 1.集合:Collect ...
随机推荐
- 远程访问TeamTalk的Mysql数据库被拒解决方法
1.A Database Error Occurred 问题如图: 蓝狐给的解答是: 这是访问mysql出错了.解决办法参考:http://www.bkjia.com/jingyan/512248.h ...
- Bone Collector(ZeroOnebag)
Bone Collector Problem Description Many years ago , in Teddy’s hometown there was a man who was call ...
- NET Core开发-获取所有注入(DI)服务
NET Core开发-获取所有注入(DI)服务 获取ASP.NET Core中所有注入(DI)服务,在ASP.NET Core中加入了Dependency Injection依赖注入. 我们在Cont ...
- [转]Windows平台下LispBox环境搭建
转自http://www.cnblogs.com/sunt2012/archive/2013/05/27/3102816.html Lisp in a Box软件包可以让新Lisp程序员在一流的Lis ...
- thinkphp项目目录
# ThinkPHP核心文件介绍 ├─ThinkPHP.php 框架入口文件 ├─Common 框架公共文件 ├─Conf 框架配置文件 ├─Extend ...
- Keil C51 与 ARM 并存方法
第一:先安装keil C51 V4.01(如果先安装ARM的话还没有试过,应该也是可以的)到文件夹keil C51,运行破解补丁,选择C51版本,RealView MDK Professional进行 ...
- express设置ejs并将后缀改为html
http://www.cnblogs.com/-nothing-/p/4943354.html http://blog.csdn.net/macyang/article/details/8841966 ...
- java笔记之静态修饰附和单例设计模式
第六天笔记 静态修饰符static: 一.static修饰成员变量: static用来修饰成员变量叫静态成员变量,没有static修饰的成员变量叫非静态成员变量 静态成员的访问方式: (1) 用 ...
- 虚拟机下opensips 启动
先启动MYSQL mysql:service mysqld start 然后启动RTP代理 rtpproxy -l 192.168.6.199 -s udp:192.168.6.199:7890 -F ...
- ssh整合启动tomcat报java.lang.ClassNotFoundException: org.apache.commons.lang.xwork.StringUtils
今天搭建了一个ssh项目环境,整合后,访问项目首页,登录不进去,控制台报错,后来调试代码后,在获取数据库数据后,返回到action时,又进入了action导致死循环,其实这里是两个问题,控制台报错如下 ...