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 相关文章推荐
通过继承IHttpHandle实现JS插件的组织与管理
Jul 13 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
Oct 20 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
jQuery显示和隐藏 常用的状态判断方法
Jan 29 Javascript
JS 作用域与作用域链详解
Apr 07 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
Jun 23 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
Oct 26 Javascript
JavaScript实现256色转灰度图
Feb 22 Javascript
jQuery实现 上升、下降、删除、添加一行代码
Mar 06 Javascript
基于iScroll实现内容滚动效果
Mar 21 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
Mar 22 Javascript
JS前端监控采集用户行为的N种姿势
Jul 23 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
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
通过隐藏option实现select的联动效果
2009/11/10 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
jsTree使用记录实例
2016/12/01 Javascript
js实现文本上下来回滚动
2017/02/03 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
Djang中静态文件配置方法
2015/07/30 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
python简单验证码识别的实现方法
2019/05/10 Python
python3实现绘制二维点图
2019/12/04 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
见习期个人总结
2015/03/05 职场文书
医药公司采购员岗位职责
2015/04/03 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python