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 相关文章推荐
漂亮的仿flash菜单,来自蓝色经典
Jun 26 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
Nov 14 Javascript
点击弹出层外区域关闭弹出层jquery特效示例
Aug 25 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
Dec 19 Javascript
AngularJS基础知识
Dec 21 Javascript
jquery插件validation实现验证身份证号等
Jun 04 Javascript
详解JavaScript逻辑Not运算符
Dec 04 Javascript
input输入框内容实时监测(附代码)
Aug 15 Javascript
jQuery中元素选择器(element)简单用法示例
May 14 jQuery
vue2.0 实现导航守卫(路由守卫)
May 21 Javascript
Vue全局loading及错误提示的思路与实现
Aug 09 Javascript
vue 实现input表单元素的disabled示例
Oct 28 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中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
PHP图片加水印实现方法
2016/05/06 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
Python中max函数用法实例分析
2015/07/17 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
django框架auth模块用法实例详解
2019/12/10 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
Linux操作面试题
2015/02/11 面试题
一份婚庆公司创业计划书
2014/01/11 职场文书
创意活动策划书
2014/01/15 职场文书
单位委托书范本
2014/04/04 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
三严三实学习心得体会
2014/10/13 职场文书
运动会新闻稿
2015/07/17 职场文书
vue修饰符.capture和.self的区别
2022/04/22 Vue.js