一页面多XMLHttpRequest对象

刚在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. }  
<script type="text/javascript">render_code();</script>
上面代码中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. };   
<script type="text/javascript">render_code();</script>
结合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. // ......   
<script type="text/javascript">render_code();</script>
最后附上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. }   
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值