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基础的动画教程,直观易懂
Jan 10 Javascript
Javascript 生成指定范围数值随机数
Jan 09 Javascript
jquery 上下滚动广告
Jun 17 Javascript
网页中的图片的处理方法与代码
Nov 26 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
Oct 10 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 Javascript
Vue实现购物车场景下的应用
Nov 27 Javascript
深入理解JavaScript的async/await
Aug 05 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
Nov 27 Javascript
深入了解JavaScript 防抖和节流
Sep 12 Javascript
Vant 中的Toast设置全局的延迟时间操作
Nov 04 Javascript
JS画布动态实现黑客帝国背景效果
Nov 08 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
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
PHP性能优化 产生高度优化代码
2011/07/22 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
PDO::rollBack讲解
2019/01/29 PHP
图片自动缩小 点击放大
2008/07/07 Javascript
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
微信小程序合法域名配置方法
2019/05/06 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
Python2.7 实现引入自己写的类方法
2018/04/29 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
车间班组长的职责
2013/12/13 职场文书
市场营销专业个人求职信范文
2013/12/14 职场文书
大学生关于奋斗的演讲稿
2014/01/09 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
党员个人对照检查材料
2014/10/01 职场文书
骨干教师个人总结
2015/02/11 职场文书
如何做好员工培训计划?
2019/07/09 职场文书