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 相关文章推荐
Jquery+WebService 校验账号是否已被注册的代码
Jul 12 Javascript
在JS中最常看到切最容易迷惑的语法(转)
Oct 29 Javascript
运算符&&的三个不同层次
Apr 07 Javascript
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
Jun 14 Javascript
JS中for循序中延迟加载动态效果的具体实现
Aug 18 Javascript
JS简单实现仿百度控制台输出信息效果
Sep 04 Javascript
WEB前端实现裁剪上传图片功能
Oct 17 Javascript
Vue.js路由组件vue-router使用方法详解
Dec 02 Javascript
使用bootstrap插件实现模态框效果
May 10 Javascript
微信小程序实现同时上传多张图片
Feb 03 Javascript
Javascript原生ajax请求代码实例
Feb 20 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
JavaScript轻松创建级联函数的方法示例
2017/02/10 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
python实现批量改文件名称的方法
2015/05/25 Python
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python面向对象进阶学习
2019/05/21 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
servlet面试题
2012/08/20 面试题
电气自动化个人求职信范文
2014/02/03 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
机动车登记业务委托书
2014/10/08 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
LeetCode189轮转数组python示例
2022/08/05 Python