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实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
Apr 10 Javascript
标题过长使用javascript按字节截取字符串
Apr 24 Javascript
js中的caller和callee属性介绍和例子
Jun 07 Javascript
javascript异步编程代码书写规范Promise学习笔记
Feb 11 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
Dec 25 Javascript
JavaScript函数内部属性和函数方法实例详解
Mar 17 Javascript
jquery 抽奖小程序实现代码
Oct 12 Javascript
Javascript获取background属性中url的值
Oct 17 Javascript
jQuery实现获取h1-h6标题元素值的方法
Mar 06 Javascript
vue-resourse将json数据输出实例
Mar 08 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
Mar 10 Javascript
基于jQuery实现瀑布流页面
Apr 11 jQuery
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
Linux下php5.4启动脚本
2014/08/03 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
javascript html 静态页面传参数
2009/04/10 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
js实现简单进度条效果
2020/03/25 Javascript
python解析xml模块封装代码
2014/02/07 Python
用Python创建声明性迷你语言的教程
2015/04/13 Python
Python实现带百分比的进度条
2016/06/28 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
详解python中的异常和文件读写
2021/01/03 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
安全资料员岗位职责
2013/12/14 职场文书
小学新学期教师寄语
2014/01/18 职场文书
2015年幼儿园毕业感言
2014/02/12 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
linux下安装redis图文详细步骤
2021/12/04 Redis
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang