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 相关文章推荐
js弹窗代码 可以指定弹出间隔
Jul 03 Javascript
封装的原生javascript弹出层代码
Sep 24 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
Jun 24 Javascript
简易的JS计算器实现代码
Oct 18 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
Jan 13 Javascript
js中DOM三级列表(代码分享)
Mar 20 Javascript
vue实现文章内容过长点击阅读全文功能的实例
Dec 28 Javascript
微信小程序HTTP接口请求封装的实现
Feb 21 Javascript
js实现点击图片在屏幕中间弹出放大效果
Sep 11 Javascript
vue学习笔记之作用域插槽实例分析
Feb 01 Javascript
Vant 中的Toast设置全局的延迟时间操作
Nov 04 Javascript
node.js文件的复制、创建文件夹等相关操作
Feb 05 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之数据库操作详解及乱码解决!
2007/01/02 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
js编写选项卡效果
2017/05/23 Javascript
详解VUE 数组更新
2017/12/16 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
西安众合通用.net笔试题
2013/03/18 面试题
.NET remoting中对象激活的两种方式
2015/06/08 面试题
应届毕业生求职信范文
2013/12/18 职场文书
大学生个人简历中的自我评价
2013/12/27 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
安全口号大全
2014/06/21 职场文书
2014年卫生工作总结
2014/11/27 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
opencv检测动态物体的实现
2021/07/21 Python
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis