JavaScript 异步调用框架 (Part 5 - 链式实现)


Posted in Javascript onAugust 04, 2009

调用入口
链式调用存在Async.go方法和Async.chain方法两个入口,这两个入口本质上是一致的,只是Async.chain方法在调用时先不提供初始参数,而Async.go方法在调用时提供了初始参数并启动异步调用链。

Async.chain = function() { 
var chain = new Async.Operation({ chain: true }); 
return chain; 
}; 
Async.go = function(initialArgument) { 
return Async.chain().go(initialArgument); 
}

在这里我们可以看到,链式调用本身也是一个Async.Operation,链式调用所需的go方法和next方法都是在Async.Operation上面做的扩展,并且这个扩展不会很难,这将在下一小节说明。
扩展方法
我们都知道,通过addCallback方法添加的回调函数是会被逐一执行的,至少同步函数如此,因此我们可以用Async.Operation的这一特性来维护异步调用队列,前提是我们为它加上对异步调用进行队列的支持。
对于异步调用进行队列的支持,我们稍后再来处理,首先我们利用现成的addCallback方法和yield方法扩展出go方法和next方法。
this.go = function(initialArgument) { 
return this.yield(initialArgument); 
} 
this.next = function(nextFunction) { 
return this.addCallback(nextFunction); 
};

实际上,go方法和next方法直接调用的正是yield方法和addCallback方法。go方法的语义与yield方法一样,传递一个参数给Async.Operation实例,并且启动调用队列。同时,next方法的语义和addCallback方法,添加一个调用到队列的末端。
异步队列
如何才能让原本仅支持同步的队列变得也支持异步?这需要检测队列中的每一个调用的返回,如果返回类型为Async.Operation,我们知道是异步调用,从而使用特殊的方法等它执行完后再执行下去。
callbackResult = callback(self.result); 
self.result = callbackResult; 
if (callbackResult && callbackResult instanceof Async.Operation) { 
innerChain = Async.chain(); 
while (callbackQueue.length > 0) { 
innerChain.next(callbackQueue.shift()); 
} 
innerChain.next(function(result) { 
self.result = result; 
self.state = "completed"; 
self.completed = true; 
return result; 
}); 
callbackResult.addCallback(function(result) { 
self.result = result; 
innerChain.go(result); 
}); 
}

如果调用返回了一个Async.Operation实例,我们就利用它自身的addCallback方法帮我们执行队列中余下的调用。准确来说,是我们构造了一个新的调用链,把队列余下的调用都转移到新的调用链上,然后让当前异步调用在回调中启动这个新的调用链。
此外还有一些地方我们需要略作修改,以兼容新的异步调用队列的。例如result、state、completed的状态变更,在链式调用中是有所不同的。
小结
我们在原有的Async.Operation上略作修改,使得它支持异步调用队列,完整的代码看这里:支持链式调用的异步调用框架Async.Operation。
现在我们已经拥有了一个功能强大的Async.Operation,接下来我们就要看看如何将它投入到更多常见的使用模式中去
Javascript 相关文章推荐
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
Jan 22 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 Javascript
javascript中获取下个月一号,是星期几
Jun 01 Javascript
jquery如何获取复选框的值
Dec 12 Javascript
javascript避免数字计算精度误差的方法详解
Mar 05 Javascript
Bootstrap每天必学之折叠
Apr 12 Javascript
webuploader模态框ueditor显示问题解决方法
Dec 27 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
Mar 09 Javascript
基于JavaScript实现的快速排序算法分析
Apr 14 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
Aug 08 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
Oct 08 Javascript
使用kbone解决Vue项目同时支持小程序问题
Nov 08 Javascript
JavaScript 异步调用框架 (Part 4 - 链式调用)
Aug 04 #Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
Aug 04 #Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
Aug 03 #Javascript
JavaScript 异步调用框架 (Part 1 - 问题 & 场景)
Aug 03 #Javascript
jQuery 相关控件的事件操作分解
Aug 03 #Javascript
利用javascript实现一些常用软件的下载导航
Aug 03 #Javascript
jQuery 隔行换色 支持键盘上下键,按Enter选定值
Aug 02 #Javascript
You might like
一些关于PHP的知识
2006/11/17 PHP
动易数据转成dedecms的php程序
2007/04/07 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
使用npm安装最新版本nodejs
2018/01/18 NodeJs
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
2019/09/19 Javascript
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
技校生自我鉴定
2013/12/08 职场文书
企业承诺书怎么写
2014/05/24 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
教师读书笔记
2015/06/29 职场文书
关于幸福的感言
2015/08/03 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
高中军训感想
2015/08/07 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server