一页面多XMLHttpRequest对象


Posted in Javascript onJanuary 22, 2007

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

在网上看到了有些同志提到了为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);    
}  

Javascript 相关文章推荐
javascript 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
Jun 10 Javascript
div层的移动及性能优化
Nov 16 Javascript
JavaScript prototype属性深入介绍
Nov 27 Javascript
js中判断用户输入的值是否为空的简单实例
Dec 23 Javascript
简介JavaScript中search()方法的使用
Jun 06 Javascript
JS获取鼠标坐标位置实例分析
Jan 20 Javascript
javascript self对象使用详解
Oct 18 Javascript
JS实现颜色动态淡化效果
Mar 06 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
Jun 06 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
Jan 03 Javascript
vue监听滚动事件的方法
Dec 21 Vue.js
javascript 播放器 控制
Jan 22 #Javascript
JAVASCRIPT HashTable
Jan 22 #Javascript
Maps Javascript
Jan 22 #Javascript
自适应高度框架 ----属个人收藏内容
Jan 22 #Javascript
Opacity.js
Jan 22 #Javascript
html读出文本文件内容
Jan 22 #Javascript
用ADODB.Stream转换
Jan 22 #Javascript
You might like
改造一台复古桌面收音机
2021/03/02 无线电
ajax取消挂起请求的处理方法
2013/03/18 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
javascript getElementsByName()的用法说明
2009/07/31 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
python基础教程之lambda表达式使用方法
2014/02/12 Python
Python中逗号的三种作用实例分析
2015/06/08 Python
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
Python操作Excel之xlsx文件
2017/03/24 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
使用python实现knn算法
2017/12/20 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
Python初学者常见错误详解
2019/07/02 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
深圳茁壮笔试题
2015/05/28 面试题
酒店仓管员岗位职责
2014/04/28 职场文书
2014年党务公开方案
2014/05/08 职场文书
单位婚育证明范本
2014/11/21 职场文书
寒山寺导游词
2015/02/03 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书