在网上看到了有些同志提到了为Ajax的XMLHttpRequest提供一个对象池,也读了他们给出的实现代码。感觉不是特别理想,于是模仿apache的commons中的ObjectPool的思路写了一个简单的JavaScript版。望指教:
function ObjectPool(poolableObjectFactory) {
this ._poolableObjectFactory = poolableObjectFactory;
this ._idlePool = [];
this ._activePool = [];
}
// 从对象池中租借一个对象,如果目前没有可用的空闲对象则通过poolableObjectFactory创建一个
// 既然是借的,用完记得一定要还哦!
ObjectPool.prototype.borrowObject = function () {
var object = null ;
var idlePool = this ._idlePool;
var factory = this ._poolableObjectFactory;
if (idlePool.length > 0 ) {
object = idlePool.pop();
}
else {
object = factory.makeObject();
}
if (object != null ) {
this ._activePool.push(object);
if (factory.activateObject) {
factory.activateObject(object);
}
}
return object;
}
// 归还一个对象
ObjectPool.prototype.returnObject = function (object) {
function indexOf(array, object) {
for ( var i = 0 ; i < array.length; i ++ ) {
if (array[i] == object) return i;
}
return - 1 ;
}
if (object != null ) {
var activePool = this ._activePool;
var factory = this ._poolableObjectFactory;
var i = indexOf(activePool, object);
if (i < 0 ) return ;
if (factory.passivateObject) {
factory.passivateObject(object);
}
activePool.splice(i, 1 );
this ._idlePool.push(object);
}
}
// 返回当前激活对象的个数
ObjectPool.prototype.getNumActive = function () {
return this ._activePool.length;
}
// 返回当前空闲对象的个数
ObjectPool.prototype.getNumIdle = function () {
return this ._idlePool.length;
}
// 销毁对象池及其中的所有对象
// 如果对象池中的对象需要析构。那么必须实现poolableObjectFactory中的destroyObject方法,同时保证ObjectPool的destroy方法在需要的时候被调用到(例如Window的unload事件中)。
ObjectPool.prototype.destroy = function () {
var factory = this ._poolableObjectFactory;
function returnObject(object) {
if (factory.passivateObject) {
factory.passivateObject(object);
}
}
function destroyObject(object) {
if (factory.destroyObject) {
factory.destroyObject(object);
}
}
var activePool = this ._activePool;
for ( var i = 0 ; i < activePool.length; i ++ ) {
var object = activePool[i];
returnObject(object);
destroyObject(object);
}
var idlePool = this ._idlePool;
for ( var i = 0 ; i < idlePool.length; i ++ ) {
var object = idlePool[i];
destroyObject(object);
}
this ._idlePool = null ;
this ._activePool = null ;
this ._poolableObjectFactory = null ;
}
上面代码中ObjectPool的构造参数poolableObjectFactory的声明如下:
// 注意: 这只是说明,不是真正的代码!
var PoolableObjectFactory = {
makeObject: function () {} , // 创建一个新的对象。(必须声明)
activateObject: function (object) {} , // 当一个对象被激活时(即被借出时)触发的方法。(可选)
passivateObject: function (object) {} , // 当一个对象被钝化时(即被归还时)触发的方法。(可选)
destroyObject: function (object) {} // 销毁一个对象。(可选)
} ;
结合XMLHttpRequest创建过程的简陋示例:
// 声明XMLHttpRequest的创建工厂
var factory = {
makeObject: function () {
// 创建XMLHttpRequset对象
if (window.ActiveXObject) {
return new ActiveXObject( " Microsoft.XMLHTTP " );
}
else {
return new XMLHttpRequest();
}
} ,
passivateObject: function (xhr) {
// 重置XMLHttpRequset对象
xhr.onreadystatechange = {} ;
xhr.abort();
}
} ;
var pool = new ObjectPool(factory); // 创建对象池
//
var xhr = pool.borrowObject(); // 获得一个XMLHttpRequest对象
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 ) {
//
pool.returnObject(xhr); // 归还XMLHttpRequest对象
}
} ;
xhr.open(method, url, true );
//
最后附上jsUnit的测试用例:
function test_pool() {
var factory = {
counter: 0 ,
makeObject: function () {
return {id: ++ this .counter} ;
} ,
activateObject: function (object) {
object.activated = true ;
} ,
passivateObject: function (object) {
object.activated = false ;
} ,
destroyObject: function (object) {
object.destroyed = true ;
}
} ;
var pool = new ObjectPool(factory);
// borrowObject object1
var object1 = pool.borrowObject();
assertEquals(object1.id, 1 );
assertTrue(object1.activated);
assertEquals(factory.counter, 1 );
assertEquals(pool.getNumActive(), 1 );
assertEquals(pool.getNumIdle(), 0 );
// borrowObject object2
var object2 = pool.borrowObject();
assertEquals(object2.id, 2 );
assertTrue(object2.activated);
assertEquals(factory.counter, 2 );
assertEquals(pool.getNumActive(), 2 );
assertEquals(pool.getNumIdle(), 0 );
// borrowObject object3
var object3 = pool.borrowObject();
assertEquals(object3.id, 3 );
assertTrue(object3.activated);
assertEquals(factory.counter, 3 );
assertEquals(pool.getNumActive(), 3 );
assertEquals(pool.getNumIdle(), 0 );
// returnObject object2
pool.returnObject(object2);
assertFalse(object2.activated);
assertEquals(factory.counter, 3 );
assertEquals(pool.getNumActive(), 2 );
assertEquals(pool.getNumIdle(), 1 );
// returnObject object3
pool.returnObject(object3);
assertFalse(object3.activated);
assertEquals(pool.getNumActive(), 1 );
assertEquals(pool.getNumIdle(), 2 );
// returnObject object1
pool.returnObject(object1);
assertFalse(object1.activated);
assertEquals(pool.getNumActive(), 0 );
assertEquals(pool.getNumIdle(), 3 );
// destroy the pool
pool.destroy();
assertTrue(object1.destroyed);
assertTrue(object2.destroyed);
assertTrue(object3.destroyed);
}
下载: http://www.blogjava.net/Files/bennybao/pool.rar
Feedback
# re: 为Ajax的XMLHttpRequest提供对象池(模仿Apache中ObjectPool的实现) 回复 更多评论
2007-02-10 01:46 by ghf
好
# re: 为Ajax的XMLHttpRequest提供对象池(模仿Apache中ObjectPool的实现) 回复 更多评论
2007-02-16 11:18 by 张沈鹏
为什么要一个activePool ,没有什么用处呀,用完了直接push进入idle,用的时候直接从idle中pop,同时把xmlrequest封装一下,让他自动来pop和push,用只要给出url和recall就可以了
我的邮箱是zsp007@gmail.com欢迎探讨
__reqPool={
idle:[],
new:function(){
var r=this.idle.pop();
if(!r){
if (window.XMLHttpRequest)r=new XMLHttpRequest();
else{
try{r=new ActiveXObject("Msxml2.XMLHTTP");}
catch(e){r=new ActiveXObject("Microsoft.XMLHTTP");}
}
}
return r;
}
open:function(url,recall,error){
var http=this.new();
http.open("GET",url,true);
http.onreadystatechange=function(){
if(http.readyState==4)
{
if(http.status==200)recall(http.responseText.toString());
else if(error) error(http.status,http.responseText.toString());
idle.push(http);
}
};
}
}
# re: 为Ajax的XMLHttpRequest提供对象池(模仿Apache中ObjectPool的实现)[未登录] 回复 更多评论
2007-02-16 13:57 by BennyBao
@张沈鹏
activePool确实不是必须的,但是有了activePool之后就可以很方便的知道究竟有多少已激活的Object,或者可以利用一个类似“守护线程”的定时器来监控每个Object的激活时间,以便与实现类似超时之类的功能。
另外需要说明的是,根据我的本意,这里的ObjectPool并不只为XMLHttp设计。
分享到:
相关推荐
ajax XMLHttpRequest。。。。。。
总的来说,XMLHttpRequest对象是实现Ajax技术的关键,它使得前端和后端可以更高效、更灵活地交互,极大地提升了Web应用的用户体验。理解并熟练掌握XMLHttpRequest的使用,对于任何前端开发者来说都至关重要。
XMLHttpRequest对象是Ajax技术的核心,它是现代Web应用中用于实现客户端与服务器间异步数据交换的关键组件。在不刷新整个页面的情况下,XMLHttpRequest允许开发者通过JavaScript动态更新网页内容,极大地提升了用户...
在JavaScript中,XMLHttpRequest(XHR)对象是用于在不刷新整个页面的情况下与服务器进行异步数据交换的关键工具。这种技术通常被称为Ajax(Asynchronous JavaScript and XML),尽管现在它不仅仅局限于XML,还包括...
在其中,可能定义了一个或多个函数,用于创建Ajax对象,执行异步请求,并且实现对象池的管理。比如,可能有一个`createAjaxObject()`函数用于生成新的XMLHttpRequest对象,而`poolAjaxObject()`和`getAjaxObject()`...
XMLHttpRequest对象是JavaScript中用于异步数据交换的核心组件,它是AJAX(Asynchronous JavaScript and XML)技术的基础。AJAX允许网页在不刷新整个页面的情况下,仅更新部分区域,从而提高用户体验。尽管名称中...
经测试,用此方法创建XMLHttpRequest对象,在运用AJAX的时候,可以的兼容IE6,IE7,IE8,Opera,Safari,Google Chrome,fireFox。主流的应该就这些吧?theWorld,遨游等浏览器都是以IE为核心的,所以肯定也没问题。 另外...
Ajax 中的 XMLHttpRequest 对象 Ajax 是一种异步的 JavaScript 与 XML 技术,用于在客户端脚本与服务器之间实现数据交互过程。XMLHttpRequest 对象是 Ajax 的技术基础,尽管现在提供了各种 Ajax 框架,但是理解这个...
2. **XMLHttpRequest对象**:这是AJAX的基础,它提供了一个在后台与服务器进行通信的API。JavaScript通过XMLHttpRequest对象可以异步地发送GET或POST请求,并获取服务器的响应数据。 3. **DOM(Document Object ...
Ajax核心对象XMLHTTPRequest详细参数及例子
XMLHttpRequest(XHR)是实现Ajax的核心对象,它允许JavaScript与服务器进行通信,接收或发送数据,实现页面的动态更新。本Demo02着重展示了如何利用XMLHttpRequest对象实现Ajax的基本用法。 在AjaxXMLHttpRequest_...
在使用AJAX技术进行前后端数据交互时,经常会出现中文字符编码的问题,尤其是在使用`XMLHttpRequest`对象发送请求的过程中。例如,在Internet Explorer(IE)浏览器与Mozilla Firefox浏览器之间存在不同的行为表现,...
### XMLHttpRequest对象的介绍和实现 #### 一、引言 随着网络应用的发展,网页与服务器之间的交互变得越来越频繁。传统的网页交互方式往往依赖于整个页面的刷新,这不仅效率低下,而且用户体验较差。为了解决这个...
XMLHttpRequest对象提供了多个方法和属性,用于控制请求的发送、接收服务器响应以及处理数据。 - **open(method, url, async)**:初始化一个新的HTTP请求。参数`method`指定请求类型(GET或POST等),`url`指定请求...
总之,XMLHttpRequest对象是实现Ajax技术的关键,它提供了一种与服务器进行无刷新交互的方式,极大地提升了Web应用的用户体验。理解并熟练掌握XMLHttpRequest对象的使用,是成为一名合格的前端开发者的必备技能。
在ASP.NET AJAX开发中,XMLHttpRequest对象是进行异步数据通信的核心组件,它允许我们向服务器发送请求并接收响应,而无需刷新整个页面。在这个例子中,我们将关注如何处理服务器返回的数据,特别是`ResponseXML`和`...
XMLHttpRequest(XHR)是Web开发中的一个关键技术,它是实现Asynchronous JavaScript and XML(Ajax)的核心组件。Ajax是一种在不刷新整个网页的情况下,能够更新部分网页的技术,极大地提升了用户体验。本手册将...
总结来说,Ajax通过XMLHttpRequest对象实现了异步数据交换,提高了网页的交互性和用户体验。学习Ajax,首先要掌握创建XMLHttpRequest对象、设置请求、发送请求以及处理响应的基本步骤。通过不断实践和深入学习,你将...
这里我们关注的是如何使用XMLHttpRequest对象来实现一个简单的信息验证功能。 XMLHttpRequest是Ajax的核心组件,它提供了一种异步与服务器通信的方式。以下是一个基本的XMLHttpRequest的使用流程: 1. **创建实例*...