一頁(yè)面多XMLHttpRequest對(duì)象
更新時(shí)間:2007年01月22日 00:00:00 作者:
剛在ajacn發(fā)了個(gè)貼,關(guān)于為XMLHttpRequest提供一個(gè)對(duì)象池?;蛟S能幫到你,轉(zhuǎn)貼如下:
在網(wǎng)上看到了有些同志提到了為Ajax的XMLHttpRequest提供一個(gè)對(duì)象池,也讀了他們給出的實(shí)現(xiàn)代碼。感覺(jué)不是特別理想,于是模仿apache的commons中的ObjectPool的思路寫(xiě)了一個(gè)簡(jiǎn)單的JavaScript版。
望指教:
代碼
function ObjectPool(poolableObjectFactory) {
this._poolableObjectFactory = poolableObjectFactory;
this._idlePool = [];
this._activePool = [];
}
// 從對(duì)象池中租借一個(gè)對(duì)象,如果目前沒(méi)有可用的空閑對(duì)象則通過(guò)poolableObjectFactory創(chuàng)建一個(gè)
// 既然是借的,用完記得一定要還哦!
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;
}
// 歸還一個(gè)對(duì)象
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);
}
}
// 返回當(dāng)前激活對(duì)象的個(gè)數(shù)
ObjectPool.prototype.getNumActive = function() {
return this._activePool.length;
}
// 返回當(dāng)前空閑對(duì)象的個(gè)數(shù)
ObjectPool.prototype.getNumIdle = function() {
return this._idlePool.length;
}
// 銷毀對(duì)象池及其中的所有對(duì)象
// 如果對(duì)象池中的對(duì)象需要析構(gòu)。那么必須實(shí)現(xiàn)poolableObjectFactory中的destroyObject方法,同時(shí)保證ObjectPool的destroy方法在需要的時(shí)候被調(diào)用到(例如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的構(gòu)造參數(shù)poolableObjectFactory的聲明如下:
代碼
// 注意: 這只是說(shuō)明,不是真正的代碼!
var PoolableObjectFactory = {
makeObject: function() {}, // 創(chuàng)建一個(gè)新的對(duì)象。(必須聲明)
activateObject: function(object) {}, // 當(dāng)一個(gè)對(duì)象被激活時(shí)(即被借出時(shí))觸發(fā)的方法。(可選)
passivateObject: function(object) {}, // 當(dāng)一個(gè)對(duì)象被鈍化時(shí)(即被歸還時(shí))觸發(fā)的方法。(可選)
destroyObject: function(object) {} // 銷毀一個(gè)對(duì)象。(可選)
};
結(jié)合XMLHttpRequest創(chuàng)建過(guò)程的簡(jiǎn)陋示例:
代碼
// 聲明XMLHttpRequest的創(chuàng)建工廠
var factory = {
makeObject: function() {
// 創(chuàng)建XMLHttpRequset對(duì)象
// 注:這里的創(chuàng)建方法不夠強(qiáng)壯,勿學(xué)!
if (window.ActiveXObject){
return new ActiveXObject("Microsoft.XMLHTTP");
}
else {
return new XMLHttpRequest();
}
},
passivateObject: function(xhr) {
// 重置XMLHttpRequset對(duì)象
xhr.onreadystatechange = {};
xhr.abort();
}
};
var pool = new ObjectPool(factory); // 創(chuàng)建對(duì)象池
// ......
var xhr = pool.borrowObject(); // 獲得一個(gè)XMLHttpRequest對(duì)象
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
// ......
pool.returnObject(xhr); // 歸還XMLHttpRequest對(duì)象
}
};
xhr.open(method, url, true);
// ......
最后附上jsUnit的測(cè)試用例:
代碼
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);
}
在網(wǎng)上看到了有些同志提到了為Ajax的XMLHttpRequest提供一個(gè)對(duì)象池,也讀了他們給出的實(shí)現(xiàn)代碼。感覺(jué)不是特別理想,于是模仿apache的commons中的ObjectPool的思路寫(xiě)了一個(gè)簡(jiǎn)單的JavaScript版。
望指教:
代碼
function ObjectPool(poolableObjectFactory) {
this._poolableObjectFactory = poolableObjectFactory;
this._idlePool = [];
this._activePool = [];
}
// 從對(duì)象池中租借一個(gè)對(duì)象,如果目前沒(méi)有可用的空閑對(duì)象則通過(guò)poolableObjectFactory創(chuàng)建一個(gè)
// 既然是借的,用完記得一定要還哦!
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;
}
// 歸還一個(gè)對(duì)象
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);
}
}
// 返回當(dāng)前激活對(duì)象的個(gè)數(shù)
ObjectPool.prototype.getNumActive = function() {
return this._activePool.length;
}
// 返回當(dāng)前空閑對(duì)象的個(gè)數(shù)
ObjectPool.prototype.getNumIdle = function() {
return this._idlePool.length;
}
// 銷毀對(duì)象池及其中的所有對(duì)象
// 如果對(duì)象池中的對(duì)象需要析構(gòu)。那么必須實(shí)現(xiàn)poolableObjectFactory中的destroyObject方法,同時(shí)保證ObjectPool的destroy方法在需要的時(shí)候被調(diào)用到(例如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的構(gòu)造參數(shù)poolableObjectFactory的聲明如下:
代碼
// 注意: 這只是說(shuō)明,不是真正的代碼!
var PoolableObjectFactory = {
makeObject: function() {}, // 創(chuàng)建一個(gè)新的對(duì)象。(必須聲明)
activateObject: function(object) {}, // 當(dāng)一個(gè)對(duì)象被激活時(shí)(即被借出時(shí))觸發(fā)的方法。(可選)
passivateObject: function(object) {}, // 當(dāng)一個(gè)對(duì)象被鈍化時(shí)(即被歸還時(shí))觸發(fā)的方法。(可選)
destroyObject: function(object) {} // 銷毀一個(gè)對(duì)象。(可選)
};
結(jié)合XMLHttpRequest創(chuàng)建過(guò)程的簡(jiǎn)陋示例:
代碼
// 聲明XMLHttpRequest的創(chuàng)建工廠
var factory = {
makeObject: function() {
// 創(chuàng)建XMLHttpRequset對(duì)象
// 注:這里的創(chuàng)建方法不夠強(qiáng)壯,勿學(xué)!
if (window.ActiveXObject){
return new ActiveXObject("Microsoft.XMLHTTP");
}
else {
return new XMLHttpRequest();
}
},
passivateObject: function(xhr) {
// 重置XMLHttpRequset對(duì)象
xhr.onreadystatechange = {};
xhr.abort();
}
};
var pool = new ObjectPool(factory); // 創(chuàng)建對(duì)象池
// ......
var xhr = pool.borrowObject(); // 獲得一個(gè)XMLHttpRequest對(duì)象
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
// ......
pool.returnObject(xhr); // 歸還XMLHttpRequest對(duì)象
}
};
xhr.open(method, url, true);
// ......
最后附上jsUnit的測(cè)試用例:
代碼
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一個(gè)無(wú)懈可擊的實(shí)例化XMLHttpRequest的方法
- AJax 學(xué)習(xí)筆記一(XMLHTTPRequest對(duì)象)
- javascript XMLHttpRequest對(duì)象全面剖析
- Ajax xmlHttpRequest的status的值的含義
- ajax 入門基礎(chǔ)之 XMLHttpRequest對(duì)象總結(jié)
- Javascript+XMLHttpRequest+asp.net無(wú)刷新讀取數(shù)據(jù)庫(kù)數(shù)據(jù)
- AJAX中同時(shí)發(fā)送多個(gè)請(qǐng)求XMLHttpRequest對(duì)象處理方法
- [js]輕便的XMLHttpRequest應(yīng)用函數(shù):downloadUrl()
- 建一個(gè)XMLHttpRequest對(duì)象池
- IE7提供XMLHttpRequest對(duì)象為兼容
- [轉(zhuǎn)]XMLHTTPRequest的屬性和方法簡(jiǎn)介
- 一份老外寫(xiě)的XMLHttpRequest代碼多瀏覽器支持兼容性
- AJAX客戶端說(shuō)明,XMLHttpRequest對(duì)象
- 建立XMLHttpRequest對(duì)象
- XMLHttpRequest of ajax
- AJAX入門之XMLHttpRequest慨述
- XMLHTTPRequest的屬性和方法簡(jiǎn)介
相關(guān)文章
Javascript動(dòng)態(tài)伸縮+淡出淡入
一種不錯(cuò)代碼應(yīng)用實(shí)例,大家可以根據(jù)這個(gè)代碼,拓寬出更好的代碼2009-02-02js實(shí)現(xiàn)網(wǎng)站最上邊可關(guān)閉的浮動(dòng)廣告條代碼
這篇文章主要介紹了js實(shí)現(xiàn)網(wǎng)站最上邊可關(guān)閉的浮動(dòng)廣告條代碼,涉及javascript基于鼠標(biāo)事件操作頁(yè)面元素樣式的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-09-09微信小程序開(kāi)發(fā)之自定義tabBar的實(shí)現(xiàn)
這篇文章主要介紹了微信小程序開(kāi)發(fā)之自定義tabBar的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09實(shí)現(xiàn)圖片首尾平滑輪播(JS原生方法—節(jié)流)
下面小編就為大家?guī)?lái)一篇實(shí)現(xiàn)圖片首尾平滑輪播(JS原生方法—節(jié)流)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10理解Javascript_14_函數(shù)形式參數(shù)與arguments
在'執(zhí)行模型詳解'的'函數(shù)執(zhí)行環(huán)境'一節(jié)中對(duì)arguments有了些許的了解,那么讓我們深入的分析一下函數(shù)的形式參數(shù)與arguments的關(guān)系。2010-10-10