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 相关文章推荐
如何用js控制frame的隐藏或显示的解决办法
Mar 20 Javascript
JS清除IE浏览器缓存的方法
Jul 26 Javascript
jquery实现的鼠标拖动排序Li或Table
May 04 Javascript
jquery JSON的解析方式示例介绍
Jul 27 Javascript
基于jquery实现的树形菜单效果代码
Sep 06 Javascript
JavaScript表单验证实例之验证表单项是否为空
Jan 10 Javascript
JavaScript中push(),join() 函数 实例详解
Sep 06 Javascript
js replace替换字符串同时替换多个方法
Nov 27 Javascript
Vue一次性简洁明了引入所有公共组件的方法
Nov 28 Javascript
利用js canvas实现五子棋游戏
Oct 11 Javascript
Javascript中window.name属性详解
Nov 19 Javascript
Vue实现简易购物车页面
Dec 30 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
PHP4实际应用经验篇(2)
2006/10/09 PHP
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
精美漂亮的php分页类代码
2013/04/02 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
7个去伪存真的JavaScript面试题
2016/01/07 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
Python魔术方法详解
2015/02/14 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
python怎么判断素数
2020/07/01 Python
Reformation官网:美国女装品牌
2018/09/14 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
外贸员简历中的自我评价
2014/03/04 职场文书
初婚未育证明样本
2014/10/24 职场文书
作风建设年度心得体会
2014/10/29 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
python办公自动化之excel的操作
2021/05/23 Python
Django使用redis配置缓存的方法
2021/06/01 Redis
Javascript webpack动态import
2022/04/19 Javascript