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 相关文章推荐
toString()一个会自动调用的方法
Feb 08 Javascript
js获取url中的参数且参数为中文时通过js解码
Mar 19 Javascript
jquery取子节点及当前节点属性值的方法
Sep 09 Javascript
jQuery实现类似淘宝网图片放大效果的方法
Jul 08 Javascript
AngularJS手动表单验证
Feb 01 Javascript
JavaScript学习笔记之数组去重
Mar 23 Javascript
深入理解JQuery中的事件与动画
May 18 Javascript
JS原生轮播图的简单实现(推荐)
Jul 22 Javascript
JS实现利用两个队列表示一个栈的方法
Dec 13 Javascript
layui之select的option叠加问题的解决方法
Mar 08 Javascript
老生常谈JS中的继承及实现代码
Jul 06 Javascript
jQuery实现简单轮播图效果
Dec 27 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
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
PHP+ajax 无刷新删除数据
2010/02/20 PHP
PHP初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
json 定义
2008/06/10 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
Javascript浅谈之this
2013/12/17 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
VUE使用axios调用后台API接口的方法
2020/08/03 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
Python 修改列表中的元素方法
2018/06/26 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
给你一面国旗 教你用python画中国国旗
2019/09/24 Python
基于Django实现日志记录报错信息
2019/12/17 Python
Python网页解析器使用实例详解
2020/05/30 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
如何用python写个模板引擎
2021/01/14 Python
高二化学教学反思
2014/01/30 职场文书
初二生物教学反思
2014/02/03 职场文书
考核工作实施方案
2014/03/30 职场文书
学生请假条
2014/04/11 职场文书
信息合作协议书
2014/10/09 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
晶体管来复再生式二管收音机
2021/04/22 无线电
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python