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实例教程(19) 使用HoTMetal(2)
Dec 23 Javascript
Javascript 个人笔记(没有整理,很乱)
Jul 07 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
Apr 15 Javascript
JS判断当前日期是否大于某个日期的实现代码
Sep 02 Javascript
在JS中如何调用JSP中的变量
Jan 22 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
May 01 Javascript
Javascript中判断对象是否为空
Jun 10 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
Jan 28 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
May 31 Javascript
angular源码学习第一篇 setupModuleLoader方法
Oct 20 Javascript
jquery鼠标悬停导航下划线滑出效果
Sep 29 jQuery
在实例中重学JavaScript事件循环
Dec 03 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/01/12 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
php时间计算相关问题小结
2016/05/09 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
Angular JS 生成动态二维码的方法
2017/02/23 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
vue-router路由参数刷新消失的问题解决方法
2017/06/17 Javascript
Mac 安装 nodejs方法(图文详细步骤)
2017/10/30 NodeJs
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
python 接口返回的json字符串实例
2018/03/27 Python
利用python修改json文件的value方法
2018/12/31 Python
python递归法解决棋盘分割问题
2019/07/17 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
Python存储读取HDF5文件代码解析
2020/11/25 Python
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
自动化专业毕业生自荐信
2013/11/01 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers