>웹 프론트엔드 >JS 튜토리얼 >하나의 page_javascript 기술에 여러 개의 XMLHttpRequest 개체가 있습니다.

하나의 page_javascript 기술에 여러 개의 XMLHttpRequest 개체가 있습니다.

WBOY
WBOY원래의
2016-05-16 19:20:131059검색

방금 ajacn에 XMLHttpRequest용 개체 풀 제공에 대한 게시물을 게시했습니다. 아마도 도움이 될 것입니다. 다음과 같이 다시 게시하십시오.

인터넷에서 몇몇 동료들이 Ajax의 XMLHttpRequest에 대한 객체 풀을 제공한다고 언급하는 것을 보았고 그들이 제공한 구현 코드도 읽었습니다. 특별히 이상적이라고 느껴지지는 않았기 때문에 Apache Commons의 ObjectPool 아이디어를 모방한 간단한 JavaScript 버전을 작성했습니다.
조언을 구합니다:


코드
function ObjectPool(poolableObjectFactory) {                                                                           This._activePool = []; 
} 
//객체 풀에서 객체를 임대합니다. 현재 사용 가능한 무료 객체가 없다면 poolableObjectFactory 
를 통해 생성하세요.//빌린 것이므로 사용 후 꼭 반납해주세요!    
ObjectPool.prototype.borrowObject = function() {    
    var 객체 = null;    
    var idlePool = this._idlePool;    
    var factory = this._poolableObjectFactory;    
    if (idlePool.length > 0) {    
        객체 = idlePool.pop();    
    }    
    else {    
        object = factory.makeObject();    
    }    
    if (object != null) {    
        this._activePool.push(object);    
        if (factory.activateObject) {    
            factory.activateObject(object);    
        }    
    }    
    반품 대상;    
}    
// 归还一个对象    
ObjectPool.prototype.returnObject = function(object) {    
    function indexOf(array, object) {    
        for(var i = 0; i             if (array[i] == object) return i;    
        }    
        반환 -1;    
    }    
    if (객체 != null) {    
        var activePool = this._activePool;    
        var factory = this._poolableObjectFactory;          
        var i = indexOf(activePool, object);    
        if (i         if (factory.passivateObject) {    
            factory.passivateObject(object);    
        }           
        activePool.splice(i, 1);    
        this._idlePool.push(객체);    
    }    
}    
// 返回当前激活对象的个数    
ObjectPool.prototype.getNumActive = function() {    
    return this._activePool.length;    
}    
// 返回当前空闲对象的个数    
ObjectPool.prototype.getNumIdle = function() {    
    return this._idlePool.length;    
}    
// 销毁对象池及其中的所有对象    
// 如果对象池中的对象需要析构。那么必须实现poolableObject Factory의 destroyObject 방법은 ObjectPool의 destroy 방법과 동일합니다.时候被调사용到(例如Window的unload事件中).    
ObjectPool.prototype.destroy = function() {    
    var factory = this._poolableObjectFactory;    
    함수 returnObject(개체) {    
        if (factory.passivateObject) {    
           factory.passivateObject(object);    
        }    
    }    
    함수 destroyObject(객체) {    
        if (factory.destroyObject) {    
            factory.destroyObject(객체);    
        }    
    }       
    var activePool = this._activePool;    
    for (var i = 0; i         var object = activePool[i];    
        returnObject(객체);    
        destroyObject(객체);    
    }    
    var idlePool = this._idlePool;    
    for (var i = 0; i         var object = idlePool[i];    
        destroyObject(객체);    
    }    
    this._idlePool = null;     
    this._activePool = null;     
    this._poolableObjectFactory = null;    
}   

上面代码中ObjectPool의 构造参数poolableObjectFactory의 声明如下: 

代码
// 주의: 这只是说明 ,不是真正代码!    
var PoolableObjectFactory = {           
    makeObject: function() {}, // 创建一个新的对象。(必须声明)       

    activateObject: function(object) {}, // 当一个对象被激活时(即)被借出时)触发적 방법입니다.(可选)    

    passivateObject: function(object) {}, // 当一个对象被钝化时(即被归还时)触发적 방법입니다.(可选)    

    destroyObject: function(객체) {} // 销毁一个对象。(선택사항)                                                                                                                makeObject: 함수() {                                                                            
if (window.ActiveXObject){
새 ActiveXObject("Microsoft.XMLHTTP") 반환
else {           새 XMLHttpRequest() 반환;                                       ,                                                                              passivateObject: function(xhr)                                                            중단(); }
}; 
var pool = new ObjectPool(factory); // 객체 풀 생성
// ......
var xhr = pool.borrowObject(); XMLHttpRequest 개체
xhr.onreadystatechange = function() {                                                                  🎜 >}; od, url, true); 🎜>function test_pool() { 
 var Factory = { 
 counter: 0, 

 makeObject: function() { 
  return {id: this.counter};                                          ) {
object.activated = },

passivateObject: function(object) {
object.activated = false ​​​​🎜> };    
    var pool = new ObjectPool(공장);    
    // 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);         
    // 풀 삭제    
    pool.destroy();    
    assertTrue(object1.destroyed);    
    assertTrue(object2.destroyed);    
    assertTrue(object3.destroyed);    
}  

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.