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 相关文章推荐
JavaScript 关键字屏蔽实现函数
Aug 02 Javascript
新鲜出炉的js tips提示效果
Apr 03 Javascript
js函数定时器实现定时读取系统实时连接数
Apr 30 Javascript
javascript实现回车键提交表单方法总结
Jan 10 Javascript
js同源策略详解
May 21 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
May 25 Javascript
JS代码实现table数据分页效果
May 26 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
Jul 22 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
Sep 06 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
May 03 Javascript
深入理解Node中的buffer模块
Jun 03 Javascript
javascript、php关键字搜索函数的使用方法
May 29 Javascript
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数组交集的优化代码分析
2011/03/06 PHP
php中设置多级目录session的问题
2011/08/08 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
php不用正则验证真假身份证
2013/11/06 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
Javascript 事件流和事件绑定
2009/07/16 Javascript
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
ExtJS判断IE浏览器类型的方法
2014/02/10 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
Vue 过滤器filters及基本用法
2017/12/26 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
python中的装饰器详解
2015/04/13 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
Python实现爬取并分析电商评论
2020/06/19 Python
python怎么对数字进行过滤
2020/07/05 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
住房抵押登记委托书
2014/09/27 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
2016年校长新年寄语
2015/08/17 职场文书