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 树控件 比较好用
Jun 11 Javascript
JavaScript 学习笔记(十六) js事件
Feb 01 Javascript
jQuery文本框(input textare)事件绑定方法教程
Apr 24 Javascript
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
js操作输入框提示信息且响应鼠标事件
Mar 25 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
May 14 Javascript
2014 HTML5/CSS3热门动画特效TOP10
Dec 07 Javascript
jQuery实现的图片分组切换焦点图插件
Jan 06 Javascript
Node.js的Mongodb使用实例
Dec 30 Javascript
vue基于mint-ui实现城市选择三级联动
Jun 30 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
May 17 Javascript
详解webpack模块加载器兼打包工具
Sep 11 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
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
PHP设计模式之注册树模式分析
2018/01/26 PHP
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
详解vue组件开发脚手架
2018/06/15 Javascript
vue+webpack中配置ESLint
2018/11/07 Javascript
JS实现滚动条触底加载更多
2019/09/19 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
华为c/c++笔试题
2016/01/25 面试题
android面试问题与答案
2016/12/27 面试题
党校学习心得体会范文
2014/09/09 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
运动员代表致辞
2015/07/29 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP