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 相关文章推荐
用Javascript数组处理多个字符串的连接问题
Aug 20 Javascript
JavaScript中json使用自己总结
Aug 13 Javascript
javascript运行机制之this详细介绍
Feb 07 Javascript
js简单实现标签云效果实例
Aug 06 Javascript
jquery单击事件和双击事件冲突解决方案
Mar 02 Javascript
TypeScript Type Innference(类型判断)
Mar 10 Javascript
原生 JS Ajax,GET和POST 请求实例代码
Jun 08 Javascript
浅析vue中常见循环遍历指令的使用 v-for
Apr 18 Javascript
微信小程序实现的自定义分享功能示例
Feb 12 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
Mar 25 Javascript
详解package.json版本号规则
Aug 01 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
Feb 09 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函数
2006/12/06 PHP
php 动态多文件上传
2009/01/18 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
Bootstrap开发实战之响应式轮播图
2016/06/02 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
在Vue项目中引入腾讯验证码服务的教程
2018/04/03 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
python脚本实现查找webshell的方法
2014/07/31 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
Pandas的数据过滤实现
2021/01/15 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
内业资料员岗位职责
2014/01/04 职场文书
企业员工薪酬方案
2014/06/04 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
交通违章检讨书
2014/09/21 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
大学推普周活动总结
2015/05/07 职场文书
学校教学工作总结2015
2015/05/19 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技