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跨Iframe选择实现代码
Aug 19 Javascript
使用Plupload实现直接上传附件至七牛云存储
Dec 26 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
Jan 29 Javascript
JS实现简单路由器功能的方法
May 27 Javascript
深入理解JavaScript单体内置对象
Jun 06 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
Jan 05 Javascript
AngularJS 文件上传控件 ng-file-upload详解
Jan 13 Javascript
Node.js五大应用性能技巧小结(必须收藏)
Aug 09 Javascript
解决vue页面刷新或者后退参数丢失的问题
Mar 13 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
Aug 31 Javascript
详解jQuery获取特殊属性的值以及设置内容
Nov 14 jQuery
详解webpack4.x之搭建前端开发环境
Mar 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高自定义性安全验证码代码
2011/11/27 PHP
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
2018/05/15 NodeJs
小程序日历控件使用方法详解
2018/12/29 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
Python中文编码那些事
2014/06/25 Python
python错误处理详解
2014/09/28 Python
python实现log日志的示例代码
2018/04/28 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
德国拖鞋网站:German Slippers
2019/11/08 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
应届生护士求职信
2013/11/01 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android
Python的三个重要函数详解
2022/01/18 Python