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 相关文章推荐
ExtJS 下拉多选框lovcombo
May 19 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
Apr 05 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
Oct 24 Javascript
jQuery实现移动 和 渐变特效的点击事件
Feb 26 Javascript
js实现带圆角的多级下拉菜单效果
Aug 28 Javascript
使用Angular.js开发的注意事项
Oct 19 Javascript
jQuery时间日期三级联动(推荐)
Nov 27 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
Dec 25 Javascript
express+vue+mongodb+session 实现注册登录功能
Dec 06 Javascript
如何从头实现一个node.js的koa框架
Jun 17 Javascript
js设计模式之单例模式原理与用法详解
Aug 15 Javascript
js实现鼠标拖曳效果
Dec 30 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 操作excel文件的方法小结
2009/12/31 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
php绘图之生成饼状图的方法
2015/01/24 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
异步动态加载js与css文件的js代码
2013/09/15 Javascript
js document.write()使用介绍
2014/02/21 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
基于JavaScript实现验证码功能
2017/04/01 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
Python3基础之基本数据类型概述
2014/08/13 Python
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
Python科学计算之Pandas详解
2017/01/15 Python
聊聊Python中的pypy
2018/01/12 Python
快速了解python leveldb
2018/01/18 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
python绘制规则网络图形实例
2019/12/09 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
python3中数组逆序输出方法
2020/12/01 Python
物业管理大学生个人的自我评价
2013/10/10 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
社区安全温馨提示语
2015/07/14 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server