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 相关文章推荐
JavaScript实现QueryString获取GET参数的方法
Jul 02 Javascript
Iframe 自动适应页面的高度示例代码
Feb 26 Javascript
JS在可编辑的div中的光标位置插入内容的方法
Nov 20 Javascript
JavaScript转换二进制编码为ASCII码的方法
Apr 16 Javascript
理解javascript中的MVC模式
Jan 28 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
May 20 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
vue左右侧联动滚动的实现代码
Jun 06 Javascript
vue页面切换项目实现转场动画的方法
Nov 12 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
Dec 13 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
Jun 25 Javascript
vue-router中hash模式与history模式的区别
Jun 23 Vue.js
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/10/09 PHP
NT IIS下用ODBC连接数据库
2006/10/09 PHP
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
PHP网络操作函数汇总
2015/05/18 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
JavaScript 继承的实现
2009/07/09 Javascript
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
javascript制作2048游戏
2015/03/30 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
vue中的mvvm模式讲解
2019/01/31 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
Python短信轰炸的代码
2020/03/25 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
python 实现图片批量压缩的示例
2020/12/18 Python
极简的HTML5模版
2015/07/09 HTML / CSS
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
班主任工作经验交流材料
2014/05/13 职场文书
工厂车间标语
2014/06/19 职场文书
捐资助学感谢信
2015/01/21 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android