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实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
Apr 20 Javascript
关于Mozilla浏览器不支持innerText的解决办法
Jan 01 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
js中精确计算加法和减法示例
Mar 28 Javascript
每天一篇javascript学习小结(Array数组)
Nov 11 Javascript
jQuery实现TAB选项卡切换特效简单演示
Mar 04 Javascript
boostrapTable的refresh和refreshOptions区别浅析
Jan 22 Javascript
ES6新增的math,Number方法
Aug 06 Javascript
AngularJS 教程及实例代码
Oct 23 Javascript
Vuex中mutations与actions的区别详解
Mar 01 Javascript
JavaScript实现随机点名器实例详解
May 07 Javascript
jsonp格式前端发送和后台接受写法的代码详解
Nov 07 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验证码类实例分享
2013/12/27 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
Vue组件开发初探
2017/02/14 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
js中的reduce()函数讲解
2019/01/18 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
vue之延时刷新实例
2019/11/14 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
Python生成MD5值的两种方法实例分析
2019/04/26 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
python关于变量名的基础知识点
2020/03/03 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
机关出纳岗位职责
2014/04/03 职场文书
社区禁毒工作方案
2014/06/02 职场文书
装修活动策划方案
2014/08/27 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
小学生成绩单评语
2014/12/31 职场文书
Python编程编写完善的命令行工具
2021/09/15 Python
Golang 并发编程 SingleFlight模式
2022/04/26 Golang