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的网站幻灯片切换效果焦点图代码
Sep 15 Javascript
iframe里的页面禁止右键事件的方法
Jun 10 Javascript
JavaScript中实现单体模式分享
Jan 29 Javascript
JavaScript按值删除数组元素的方法
Apr 24 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
Jun 05 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
Aug 20 Javascript
纯JavaScript手写图片轮播代码
Oct 20 Javascript
vue-cli脚手架引入图片的几种方法总结
Mar 13 Javascript
了解ESlint和其相关操作小结
May 21 Javascript
深入理解Antd-Select组件的用法
Feb 25 Javascript
JS新手入门数组处理的实用方法汇总
Apr 07 Javascript
vue实现滑动解锁功能
Mar 03 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
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
javascript每日必学之继承
2016/02/23 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
在Python中使用成员运算符的示例
2015/05/13 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
python学生管理系统学习笔记
2019/03/19 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
面向中国市场的在线海淘美妆零售网站:Beauty House美丽屋
2021/03/02 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
小学信息技术教学反思
2014/02/10 职场文书
巾帼文明岗汇报材料
2014/12/24 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python