博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 异步流程控制之 avQ(avril.queue)
阅读量:5846 次
发布时间:2019-06-18

本文共 3167 字,大约阅读时间需要 10 分钟。

 

废话前言

 

写了多年的js,遇到过最蛋疼的事情莫过于callback hell, 相信大家也感同身受。

业界许多大大也为此提出了很多不错的解决方案,我所了解的主要有:

  • 朴灵 event proxy, 简单明了容易上手
  • 老赵的 wind.js, 写起来最舒坦,最能表达程序顺序执行逻辑
  • Promise,个人感觉为解决一个坑引入另外一个坑,写出来的代码一大坨,代码可读性最差

我这人闲着没事也爱折腾,我也自己造轮子,不为别的只为自己代码写的舒服流畅.

传送门:目前只支持 node.js 环境,以后有时间再增加浏览器支持

  • github   
  • 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

 

 

转载于:https://www.cnblogs.com/flowforever/p/4231293.html

你可能感兴趣的文章
文件类型,文件权限
查看>>
Xamarin.Forms教程开发的Xcode的下载安装
查看>>
js 将json字符串转换为json兑现
查看>>
java读取properties配置文件
查看>>
C/C++语言经典著作
查看>>
分布式文件系统之MogileFS实现
查看>>
qtcreator 错误error:stray'\243'in program
查看>>
工作之命令小总结(7):tail命令
查看>>
LVS+keepalived负载均衡
查看>>
YII分页显示数据
查看>>
Android下获取状态栏的高度
查看>>
Start Developing iOS Apps Today系列(六)
查看>>
UITableview中cell重用引起的内容重复的问题
查看>>
stm32 ADC使用 单通道 多通道
查看>>
Windows服务器配置与管理
查看>>
UVA 10003 Cutting Sticks
查看>>
DRP项目总结
查看>>
图的连通性——无向图的连通分量和生成树
查看>>
Linux安装更新JDK
查看>>
VM10.0上创建Windows server 2008 SP2,并且,安装loadrunner11
查看>>