javascript 支持链式调用的异步调用框架Async.Operation

 更新时间:2009年08月04日 00:13:09   作者:  
javascript 支持链式调用的异步调用框架Async.Operation
复制代码 代码如下:

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);
}

相关文章

  • js实现一个简单的数字时钟效果

    js实现一个简单的数字时钟效果

    本文主要介绍了js实现一个简单的数字时钟效果的示例代码。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • 不错的新闻标题颜色效果

    不错的新闻标题颜色效果

    [红色]不错的新闻标题颜色效果...
    2006-12-12
  • 微信小程序静默登录和维护自定义登录态详解

    微信小程序静默登录和维护自定义登录态详解

    这篇文章主要给大家介绍了关于微信小程序静默登录和维护自定义登录态的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • webpack DllPlugin xxx is not defined解决办法

    webpack DllPlugin xxx is not defined解决办法

    这篇文章主要介绍了webpack DllPlugin xxx is not defined解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • JS获取当前日期和时间的简单实例

    JS获取当前日期和时间的简单实例

    这篇文章主要介绍了JS获取当前日期和时间的简单实例,有需要的朋友可以参考一下
    2013-11-11
  • JS实现Ajax的方法分析

    JS实现Ajax的方法分析

    这篇文章主要介绍了JS实现Ajax的方法,结合实例形式分析了ajax的概念、原理、js实现与使用方法,需要的朋友可以参考下
    2016-12-12
  • JavaScript中数组双重去重的方法总结

    JavaScript中数组双重去重的方法总结

    这篇文章主要为大家学习介绍了JavaScript中数组双重去重的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-07-07
  • 详解JS中? ?和?. 和||的区别

    详解JS中? ?和?. 和||的区别

    这篇文章主要介绍了详解JS中? ?和?. 和||的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • javascript 窗口加载蒙板 内嵌网页内容

    javascript 窗口加载蒙板 内嵌网页内容

    用于在现有窗口上加载蒙板,在蒙板内在嵌入其他页面内容
    2010-11-11
  • 原生js实现放大镜效果

    原生js实现放大镜效果

    本文主要分享了原生js封装实现放大镜效果的示例代码,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论