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 相关文章推荐
破解Session cookie的方法
Jul 28 Javascript
一个可绑定数据源的jQuery数据表格插件
Jul 17 Javascript
详解JavaScript的策略模式编程
Jun 24 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
Jan 28 Javascript
基于js对象,操作属性、方法详解
Aug 11 Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 Javascript
基于JavaScript实现购物网站商品放大镜效果
Sep 06 Javascript
百度多文件异步上传控件webuploader基本用法解析
Nov 07 Javascript
js 获取html5的data属性实现方法
Jul 28 Javascript
JS实现的ajax和同源策略(实例讲解)
Dec 01 Javascript
javascript将扁平的数据转为树形结构的高效率算法
Feb 27 Javascript
vue递归获取父元素的元素实例
Aug 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
屏蔽浏览器缓存另类方法
2006/10/09 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
PHPExcel读取Excel文件的实现代码
2011/12/06 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
PHP函数积累总结
2019/03/19 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
JavaScript中join()方法的使用简介
2015/06/09 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
React如何避免重渲染
2018/04/10 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
用python简单实现mysql数据同步到ElasticSearch的教程
2018/05/30 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
Python中的面向接口编程示例详解
2021/01/17 Python
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
实现向右循环移位
2014/07/31 面试题
工程造价专业大学生自荐信
2013/10/01 职场文书
销售总监工作职责
2013/11/21 职场文书
中学教师自我鉴定
2014/02/07 职场文书
保护环境建议书300字
2014/05/13 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
运动会加油稿20字
2014/11/15 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
老干部座谈会主持词
2015/07/03 职场文书