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 相关文章推荐
IE中直接运行显示当前网页中的图片 推荐
Aug 31 Javascript
javascript之可拖动的iframe效果代码
Aug 01 Javascript
IE下使用cloneNode注意事项分享
Nov 22 Javascript
document.forms用法示例介绍
Jun 26 Javascript
JS中Location使用详解
May 12 Javascript
js鼠标点击图片切换效果实现代码
Nov 19 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
Feb 05 Javascript
去除html代码里面的script正则方法
May 19 Javascript
Web程序员必备的7个JavaScript函数
Jun 14 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
Nov 03 Javascript
6行代码实现微信小程序页面返回顶部效果
Dec 28 Javascript
Vue如何实现验证码输入交互
Dec 07 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模板中出现空行解决方法
2011/03/08 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
PHP基本语法实例总结
2016/09/09 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
PHP调用其他文件中的类
2018/04/02 PHP
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
js使用栈来实现10进制转8进制与取除数及余数
2014/06/11 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
python的urllib模块显示下载进度示例
2014/01/17 Python
Python实现的RSS阅读器实例
2015/07/25 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
2015大学生实训报告
2014/11/05 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers
python中pandas对多列进行分组统计的实现
2021/06/18 Python
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js