`
crazier9527
  • 浏览: 1004962 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XMLHttpRequest对象池

    博客分类:
  • AJAX
阅读更多

刚在ajacn发了个贴,关于为XMLHttpRequest提供一个对象池。或许能帮到你,转贴如下:

在网上看到了有些同志提到了为Ajax的XMLHttpRequest提供一个对象池,也读了他们给出的实现代码。感觉不是特别理想,于是模仿apache的commons中的ObjectPool的思路写了一个简单的JavaScript版。
望指教:

代码
  1. function ObjectPool(poolableObjectFactory) {   
  2.     this._poolableObjectFactory = poolableObjectFactory;   
  3.     this._idlePool = [];    
  4.     this._activePool = [];    
  5. }   
  6. // 从对象池中租借一个对象,如果目前没有可用的空闲对象则通过poolableObjectFactory创建一个   
  7. // 既然是借的,用完记得一定要还哦!   
  8. ObjectPool.prototype.borrowObject = function() {   
  9.     var object = null;   
  10.     var idlePool = this._idlePool;   
  11.     var factory = this._poolableObjectFactory;   
  12.     if (idlePool.length > 0) {   
  13.         object = idlePool.pop();   
  14.     }   
  15.     else {   
  16.         object = factory.makeObject();   
  17.     }   
  18.     if (object != null) {   
  19.         this._activePool.push(object);   
  20.         if (factory.activateObject) {   
  21.             factory.activateObject(object);   
  22.         }   
  23.     }   
  24.     return object;   
  25. }   
  26. // 归还一个对象   
  27. ObjectPool.prototype.returnObject = function(object) {   
  28.     function indexOf(array, object) {   
  29.         for (var i = 0; i < array.length; i++) {   
  30.             if (array[i] == object) return i;   
  31.         }   
  32.         return -1;   
  33.     }   
  34.     if (object != null) {   
  35.         var activePool = this._activePool;   
  36.         var factory = this._poolableObjectFactory;         
  37.         var i = indexOf(activePool, object);   
  38.         if (i < 0return;         
  39.         if (factory.passivateObject) {   
  40.             factory.passivateObject(object);   
  41.         }          
  42.         activePool.splice(i, 1);   
  43.         this._idlePool.push(object);   
  44.     }   
  45. }   
  46. // 返回当前激活对象的个数   
  47. ObjectPool.prototype.getNumActive = function() {   
  48.     return this._activePool.length;   
  49. }   
  50. // 返回当前空闲对象的个数   
  51. ObjectPool.prototype.getNumIdle = function() {   
  52.     return this._idlePool.length;   
  53. }   
  54. // 销毁对象池及其中的所有对象   
  55. // 如果对象池中的对象需要析构。那么必须实现poolableObjectFactory中的destroyObject方法,同时保证ObjectPool的destroy方法在需要的时候被调用到(例如Window的unload事件中)。   
  56. ObjectPool.prototype.destroy = function() {   
  57.     var factory = this._poolableObjectFactory;   
  58.     function returnObject(object) {   
  59.         if (factory.passivateObject) {   
  60.             factory.passivateObject(object);   
  61.         }   
  62.     }   
  63.     function destroyObject(object) {   
  64.         if (factory.destroyObject) {   
  65.             factory.destroyObject(object);   
  66.         }   
  67.     }      
  68.     var activePool = this._activePool;   
  69.     for (var i = 0; i < activePool.length; i++) {   
  70.         var object = activePool[i];   
  71.         returnObject(object);   
  72.         destroyObject(object);   
  73.     }   
  74.     var idlePool = this._idlePool;   
  75.     for (var i = 0; i < idlePool.length; i++) {   
  76.         var object = idlePool[i];   
  77.         destroyObject(object);   
  78.     }   
  79.     this._idlePool = null;    
  80.     this._activePool = null;    
  81.     this._poolableObjectFactory = null;   
  82. }  

<noscript type="text/javascript"></noscript>
上面代码中ObjectPool的构造参数poolableObjectFactory的声明如下:

代码
  1. // 注意: 这只是说明,不是真正的代码!   
  2. var PoolableObjectFactory = {          
  3.     makeObject: function() {}, // 创建一个新的对象。(必须声明)      
  4.        
  5.     activateObject: function(object) {}, // 当一个对象被激活时(即被借出时)触发的方法。(可选)   
  6.        
  7.     passivateObject: function(object) {}, // 当一个对象被钝化时(即被归还时)触发的方法。(可选)   
  8.        
  9.     destroyObject: function(object) {} // 销毁一个对象。(可选)          
  10. };   

<noscript type="text/javascript"></noscript>
结合XMLHttpRequest创建过程的简陋示例:

代码
  1. // 声明XMLHttpRequest的创建工厂   
  2. var factory = {        
  3.     makeObject: function() {   
  4.         // 创建XMLHttpRequset对象   
  5.         // 注:这里的创建方法不够强壮,勿学!   
  6.         if (window.ActiveXObject){   
  7.             return new ActiveXObject("Microsoft.XMLHTTP");   
  8.         }   
  9.         else {   
  10.             return new XMLHttpRequest();   
  11.         }   
  12.     },             
  13.     passivateObject: function(xhr) {   
  14.         // 重置XMLHttpRequset对象   
  15.         xhr.onreadystatechange = {};   
  16.         xhr.abort();   
  17.     }   
  18. };   
  19. var pool = new ObjectPool(factory); // 创建对象池   
  20. // ......   
  21. var xhr = pool.borrowObject(); // 获得一个XMLHttpRequest对象   
  22. xhr.onreadystatechange = function() {   
  23.     if (xhr.readyState == 4) {   
  24.         // ......   
  25.         pool.returnObject(xhr); // 归还XMLHttpRequest对象   
  26.     }   
  27. };   
  28. xhr.open(method, url, true);   
  29. // ......   

<noscript type="text/javascript"></noscript>
最后附上jsUnit的测试用例:

代码
  1. function test_pool() {   
  2.     var factory = {   
  3.         counter: 0,   
  4.            
  5.         makeObject: function() {   
  6.             return {id: ++ this.counter};              
  7.         },         
  8.            
  9.         activateObject: function(object) {   
  10.             object.activated = true;   
  11.         },   
  12.            
  13.         passivateObject: function(object) {   
  14.             object.activated = false;              
  15.         },   
  16.            
  17.         destroyObject: function(object) {   
  18.             object.destroyed = true;               
  19.         }   
  20.     };   
  21.     var pool = new ObjectPool(factory);   
  22.     // borrowObject object1   
  23.     var object1 = pool.borrowObject();   
  24.     assertEquals(object1.id, 1);   
  25.     assertTrue(object1.activated);   
  26.     assertEquals(factory.counter, 1);   
  27.     assertEquals(pool.getNumActive(), 1);   
  28.     assertEquals(pool.getNumIdle(), 0);   
  29.     // borrowObject object2   
  30.     var object2 = pool.borrowObject();   
  31.     assertEquals(object2.id, 2);   
  32.     assertTrue(object2.activated);   
  33.     assertEquals(factory.counter, 2);   
  34.     assertEquals(pool.getNumActive(), 2);   
  35.     assertEquals(pool.getNumIdle(), 0);   
  36.     // borrowObject object3   
  37.     var object3 = pool.borrowObject();   
  38.     assertEquals(object3.id, 3);   
  39.     assertTrue(object3.activated);   
  40.     assertEquals(factory.counter, 3);   
  41.     assertEquals(pool.getNumActive(), 3);   
  42.     assertEquals(pool.getNumIdle(), 0);   
  43.     // returnObject object2   
  44.     pool.returnObject(object2);   
  45.     assertFalse(object2.activated);   
  46.     assertEquals(factory.counter, 3);   
  47.     assertEquals(pool.getNumActive(), 2);   
  48.     assertEquals(pool.getNumIdle(), 1);   
  49.     // returnObject object3   
  50.     pool.returnObject(object3);   
  51.     assertFalse(object3.activated);   
  52.     assertEquals(pool.getNumActive(), 1);   
  53.     assertEquals(pool.getNumIdle(), 2);   
  54.     // returnObject object1   
  55.     pool.returnObject(object1);   
  56.     assertFalse(object1.activated);   
  57.     assertEquals(pool.getNumActive(), 0);   
  58.     assertEquals(pool.getNumIdle(), 3);        
  59.     // destroy the pool   
  60.     pool.destroy();   
  61.     assertTrue(object1.destroyed);   
  62.     assertTrue(object2.destroyed);   
  63.     assertTrue(object3.destroyed);   
  64. }
分享到:
评论

相关推荐

    用js创建XMLHttpRequest对象池

    为了优化这一过程,我们可以考虑创建一个XMLHttpRequest对象池,复用这些对象而不是每次请求都新建。 首先,理解XMLHttpRequest的基本工作原理至关重要。当一个XHR对象被创建时,它会占用一定的系统资源,包括内存...

    建一个XMLHttpRequest对象池

    在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest 对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建...

    ajax 对象池,一个页面多个XMLHttpRequest对象

    ajax XMLHttpRequest。。。。。。

    javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象

    为了解决这个问题,我们可以构建一个XMLHttpRequest对象池,合理地复用这些对象,从而提高应用程序的效率。 对象池是一种设计模式,用于管理一组可重用的对象,避免了反复创建和销毁对象的开销。在JavaScript中,...

    Ajax使用总结

    当涉及到大量并发请求时,XMLHttpRequest对象池的概念就变得重要了。浏览器会限制同一时刻可以发起的并发请求数量,以防止资源耗尽。对象池就是预先创建并缓存一定数量的XMLHttpRequest实例,当需要发送请求时,可以...

    ajax对象池

    `说明.txt`文件可能是对Ajax对象池实现的详细解释或者使用指南,包括如何初始化对象池,如何从池中获取和归还Ajax对象,以及如何配置对象池的大小和回收策略等。通常,对象池的大小需要根据应用的实际需求进行调整,...

    一页面多XMLHttpRequest对象

    ### 一页面多XMLHttpRequest对象知识点详解 #### 1. XMLHttpRequest与Ajax技术 - **XMLHttpRequest简介**:`XMLHttpRequest`是一种内置的JavaScript对象,它允许网页向服务器发送异步请求并处理响应,无需重新加载...

    AJAX中同时发送多个请求XMLHttpRequest对象处理方法

    在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一...

    十分钟打造AutoComplete自动完成效果代码

    .老生常谈—XmlHttpRequest 代码 代码如下: var xmlHttp; function createXmlHttpRequest() { if... } } 如果不用Jquery手写javascript,上面要改成XmlHttpRequest对象池,这就不写了。 .触发AutoComplete函数 代码

    ajax实现注册验证+数据库连接池

    2. **Ajax请求**:利用JavaScript的XMLHttpRequest对象或者更现代的Fetch API,向服务器发送异步请求,携带用户名作为参数。 3. **服务器处理**:后端接收到请求,查询数据库中是否有相同的用户名。 4. **响应反馈**...

    基于ASP的网b爬虫程序.zip

    在ASP环境下,开发者可能使用XMLHttpRequest对象或者第三方库来模拟HTTP请求,获取网页内容,然后通过正则表达式或DOM解析技术提取所需信息,并将数据存储到数据库或文件中。 【ASP中的HTTP请求】在ASP中,可以使用...

    [removed]以前写的xmlhttp池,代码

    1. **定义Pool类**:通过定义一个Pool类,我们可以创建一个XHR对象池。这个类中包含一些方法来管理XHR对象的创建、获取和重用。 2. **构造函数**:在Pool类的构造函数中,我们需要初始化一个数组`_cacheCase`,用于...

    一个简单dwr的使用例子,tomcat数据库连接池

    DWR允许JavaScript在用户的浏览器中直接调用服务器端的Java方法,这通过XMLHttpRequest对象实现了异步通信。DWR提供了一个自动化处理这些请求和响应的框架,减少了开发者处理低级Ajax细节的工作量。 在本示例中,...

    Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器

    `proxyPool` 属性是一个对象池,用于存储创建的XMLHttpRequest或XDomainRequest实例。`length`方法用于计算池中的对象数量,通过遍历池中的属性并减去1(因为属性`length`自身也计算在内)。 2. **索引和异步设置*...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx

    它的核心在于利用JavaScript创建XMLHttpRequest对象,通过这个对象,可以在后台与服务器进行通信,无需刷新整个页面就能获取或发送数据。这一特性显著提升了用户体验,减少了服务器的负载,因为只需要传输必要的信息...

Global site tag (gtag.js) - Google Analytics