javascript 支持链式调用的异步调用框架Async.Operation


Posted in Javascript onAugust 04, 2009
Async = {}; 
Async.Operation = function(options) { 
options = options || {}; 
var callbackQueue = []; 
var chain = (options.chain && options.chain === true) ? true : false; 
var started = false; 
var innerChain = null; 
this.result = undefined; 
this.state = "running"; 
this.completed = false; 
this.yield = function(result) { 
var self = this; 
if (!chain) { 
self.result = result; 
self.state = "completed"; 
self.completed = true; 
} else { 
started = true; 
self.result = result; 
self.state = "chain running"; 
self.completed = false; 
} 
setTimeout(function() { 
if (!innerChain) { 
while (callbackQueue.length > 0) { 
var callback = callbackQueue.shift(); 
if (chain) { 
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); 
}); 
} 
} else { 
callback(self.result); 
} 
} 
if (!innerChain) { 
self.state = "completed"; 
self.completed = true; 
} 
} else { 
while (callbackQueue.length > 0) { 
innerChain.next(callbackQueue.shift()); 
} 
innerChain.next(function(result) { 
self.result = result; 
self.state = "completed"; 
self.completed = true; 
return result; 
}); 
} 
}, 1); 
return this; 
}; 
this.go = function(initialArgument) { 
return this.yield(initialArgument); 
} 
this.addCallback = function(callback) { 
callbackQueue.push(callback); 
if (this.completed || (chain && started)) { 
this.yield(this.result); 
} 
return this; 
}; 
this.next = function(nextFunction) { 
return this.addCallback(nextFunction); 
}; 
}; 
Async.chain = function(firstFunction) { 
var chain = new Async.Operation({ chain: true }); 
if (firstFunction) { 
chain.next(firstFunction); 
} 
return chain; 
}; 
Async.go = function(initialArgument) { 
return Async.chain().go(initialArgument); 
}
Javascript 相关文章推荐
JS:window.onload的使用介绍
Nov 13 Javascript
jquery ui bootstrap 实现自定义风格
Nov 14 Javascript
js获取内联样式的方法
Jan 27 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
Sep 15 Javascript
javascript中tostring()和valueof()的用法及两者的区别
Nov 16 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
Mar 20 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 Javascript
使用react实现手机号的数据同步显示功能的示例代码
Apr 03 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
Sep 30 Javascript
vue+element tabs选项卡分页效果
Jun 29 Javascript
es6函数name属性功能与用法实例分析
Apr 18 Javascript
vue实现下载文件流完整前后端代码
Nov 17 Vue.js
JavaScript 异步调用框架 (Part 5 - 链式实现)
Aug 04 #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
You might like
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
Symfony控制层深入详解
2016/03/17 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
php的常量和变量实例详解
2017/06/27 PHP
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
详解javascript函数的参数
2015/11/10 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
原生js生成图片验证码
2020/10/11 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
使用python分析git log日志示例
2014/02/27 Python
python与php实现分割文件代码
2017/03/06 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
基于python实现KNN分类算法
2020/04/23 Python
Python实现简单查找最长子串功能示例
2019/02/26 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python线程信号量semaphore使用解析
2019/11/30 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
linux面试题参考答案(3)
2012/09/13 面试题
小学教师节活动方案
2014/01/31 职场文书
好人好事事迹材料
2014/02/12 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
Window server中安装Redis的超详细教程
2021/11/17 Redis