방금 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);
}