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 下拉框联动实现代码
Apr 09 Javascript
jQuery初学:find()方法及children方法的区别分析
Jan 31 Javascript
javascript获取鼠标点击元素对象(示例代码)
Dec 20 Javascript
jquery阻止后续事件只执行第一个事件
Jul 24 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
Aug 27 Javascript
javascript history对象详解
Feb 09 Javascript
Vue学习笔记进阶篇之单元素过度
Jul 19 Javascript
jQuery中元素选择器(element)简单用法示例
May 14 jQuery
JavaScript指定断点操作实例教程
Sep 18 Javascript
微信接入之获取用户头像的方法步骤
Sep 23 Javascript
使用layui前端框架弹出form表单以及提交的示例
Oct 25 Javascript
js之ajax文件上传
May 13 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中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
php简单实现MVC
2015/02/05 PHP
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
python中的对象拷贝示例 python引用传递
2014/01/23 Python
pandas DataFrame实现几列数据合并成为新的一列方法
2018/06/08 Python
python与caffe改变通道顺序的方法
2018/08/04 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
Python字节单位转换实例
2019/12/05 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
jupyter notebook 多行输出实例
2020/04/09 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
VIVOBAREFOOT赤脚鞋:让您的脚做自然的事情
2017/06/01 全球购物
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
高中生活自我鉴定
2014/01/18 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
2015年元旦标语大全
2014/12/09 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android
Python中如何处理常见报错
2022/01/18 Python
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang
Go语言编译原理之源码调试
2022/08/05 Golang