一页面多XMLHttpRequest对象

2016-02-19 10:52 37 1 收藏

今天图老师小编给大家介绍下一页面多XMLHttpRequest对象,平时喜欢一页面多XMLHttpRequest对象的朋友赶紧收藏起来吧!记得点赞哦~

【 tulaoshi.com - Web开发 】

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

来源:http://www.tulaoshi.com/n/20160219/1595959.html

延伸阅读
编辑Word文档或添加页面时偶尔会多添加一个,面对这种情况该怎么解决呢?怎样才能把多添加的页面整页删除呢?鉴于新手朋友们比较多,这里制作了一个word删除一页纸的教程。另外整理了一些与之相关知识点,希望对大家有所帮助。 1、word2007文档多出一页纸怎么删? 点击页面右下角的视图模式 找到普通模式并点击 切换成功后用鼠标选定分页符按...
标签: word
word最后一页空白页怎么删除   方法一:将光标定位在倒数第二页的末尾,直接按delete键进行删除。或者可以试试按住ctrl键再按delete键。 方法二:将光标移动到最后一页的起始处,不停的按删除键,就可以删除最后一页。 方法三:找到菜单栏的页面设置,将页边距的上下值稍微改小一点,同样可以删除最后一页。 ...
去除Word2013页面边框设置的视频 去除Word2013页面边框设置方法 1、打开一个有页面边框的word文档,就用下面这个表格来做个小示范,怎样删除页面的边框。 2、点击选择菜单栏的设计选项,然后再选择里面的设计工具。如下所示,打开的设计工具的一项有很多的小工具可以让我们选择来使用。 3、 在上面的选项中,打开页面边框的...
标签: Web开发
AJAX-更多有关XMLHttpRequest对象的知识 在向服务器发送数据之前,我们有必要解释一下XMLHttpRequest对象的三个重要的属性。 onreadystatechange属性 onreadystatechange属性存有处理服务器响应的函数。下面的代码定义一个空的函数,可同时对onreadystatechange属性进行设置: xmlHttp.onreadystatechange=...
XMLHttpRequest对象是当今所有AJAX和Web 2.0应用程序的技术基础。尽管软件经销商和开源社团现在都在提供各种AJAX框架以进一步简化XMLHttpRequest对象的使用;但是,我们仍然很有必要理解这个对象的详细工作机制。 一、 引言 异步JavaScript与XML(AJAX)是一个专用术语,用于实现在客户端脚本与服务器之间的数据交互过程。这一技术的...

经验教程

403

收藏

59
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部