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

相关文章

  • 微信小程序之高德地图多点路线规划过程示例详解

    微信小程序之高德地图多点路线规划过程示例详解

    这篇文章主要介绍了微信小程序之高德地图多点路线规划过程示例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Javascript实现div的toggle效果实例分析

    Javascript实现div的toggle效果实例分析

    这篇文章主要介绍了Javascript实现div的toggle效果的方法,实例分析了采用纯javascript实现toggle效果的相关技巧,需要的朋友可以参考下
    2015-06-06
  • Element ui 下拉多选时新增一个选择所有的选项

    Element ui 下拉多选时新增一个选择所有的选项

    这篇文章主要介绍了Element ui 下拉多选时 新增一个选择所有的选项,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • JS图片根据鼠标滚动延时加载的实例代码

    JS图片根据鼠标滚动延时加载的实例代码

    这篇文章介绍了,JS图片根据鼠标滚动延时加载的实例代码,有需要的朋友可以参考一下
    2013-07-07
  • document节点对象的获取方式示例介绍

    document节点对象的获取方式示例介绍

    如果要操作一个元素,首先要获取到它,下面为大家介绍下document节点对象的获取方式,感兴趣的朋友不要错过
    2013-12-12
  • javaScript中FormData使用方法示例

    javaScript中FormData使用方法示例

    这篇文章主要为大家介绍了javaScript中FormData使用方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • javascript数组克隆简单实现方法

    javascript数组克隆简单实现方法

    这篇文章主要介绍了javascript数组克隆简单实现方法,实例分析了JavaScript中concat用于数组克隆的使用技巧,需要的朋友可以参考下
    2015-12-12
  • 使用UniApp框架来阻止事件冒泡

    使用UniApp框架来阻止事件冒泡

    在开发移动应用程序时,我们经常需要处理用户交互事件,然而,有时候这些事件会冒泡,导致意外的行为和不良用户体验,在本文中,我们将探讨如何使用UniApp框架来阻止事件冒泡,并提供一些示例代码来帮助您理解如何实现这一功能,需要的朋友可以参考下
    2023-11-11
  • 基于Javascript开发连连看游戏小程序

    基于Javascript开发连连看游戏小程序

    这篇文章主要介绍了基于Java开发连连看游戏小程序,连连看是在有限的时间内,只要把所有能连接的相同图案,两个一对地找出来,消除全部就成功了,文中提供了解决思路和部分实现代码,需要的朋友可以参考下
    2023-03-03
  • JavaScript 错误捕获与处理的完整指南

    JavaScript 错误捕获与处理的完整指南

    在JavaScript中捕获错误通常有四种方式,try-catch 语句块,Promise 的 catch 方法,throw 语句以及window.onerror事件处理程序,并通过代码示例给大家讲解的非常详细,需要的朋友可以参考下
    2024-02-02

最新评论