刚在ajacn发了个贴,关于为XMLHttpRequest提供一个对象池。或许能帮到你,转贴如下:
在网上看到了有些同志提到了为Ajax的XMLHttpRequest提供一个对象池,也读了他们给出的实现代码。感觉不是特别理想,于是模仿apache的commons中的ObjectPool的思路写了一个简单的JavaScript版。
望指教:
代码
- function ObjectPool(poolableObjectFactory) {
- this._poolableObjectFactory = poolableObjectFactory;
- this._idlePool = [];
- this._activePool = [];
- }
-
-
- 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;
- }
-
-
- 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;
- }
<noscript type="text/javascript"></noscript>
上面代码中ObjectPool的构造参数poolableObjectFactory的声明如下:
代码
-
- var PoolableObjectFactory = {
- makeObject: function() {},
-
- activateObject: function(object) {},
-
- passivateObject: function(object) {},
-
- destroyObject: function(object) {}
- };
<noscript type="text/javascript"></noscript>
结合XMLHttpRequest创建过程的简陋示例:
代码
-
- var factory = {
- makeObject: function() {
-
-
- if (window.ActiveXObject){
- return new ActiveXObject("Microsoft.XMLHTTP");
- }
- else {
- return new XMLHttpRequest();
- }
- },
- passivateObject: function(xhr) {
-
- xhr.onreadystatechange = {};
- xhr.abort();
- }
- };
- var pool = new ObjectPool(factory);
-
- var xhr = pool.borrowObject();
- xhr.onreadystatechange = function() {
- if (xhr.readyState == 4) {
-
- pool.returnObject(xhr);
- }
- };
- xhr.open(method, url, true);
-
<noscript type="text/javascript"></noscript>
最后附上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);
-
- var object1 = pool.borrowObject();
- assertEquals(object1.id, 1);
- assertTrue(object1.activated);
- assertEquals(factory.counter, 1);
- assertEquals(pool.getNumActive(), 1);
- assertEquals(pool.getNumIdle(), 0);
-
- var object2 = pool.borrowObject();
- assertEquals(object2.id, 2);
- assertTrue(object2.activated);
- assertEquals(factory.counter, 2);
- assertEquals(pool.getNumActive(), 2);
- assertEquals(pool.getNumIdle(), 0);
-
- var object3 = pool.borrowObject();
- assertEquals(object3.id, 3);
- assertTrue(object3.activated);
- assertEquals(factory.counter, 3);
- assertEquals(pool.getNumActive(), 3);
- assertEquals(pool.getNumIdle(), 0);
-
- pool.returnObject(object2);
- assertFalse(object2.activated);
- assertEquals(factory.counter, 3);
- assertEquals(pool.getNumActive(), 2);
- assertEquals(pool.getNumIdle(), 1);
-
- pool.returnObject(object3);
- assertFalse(object3.activated);
- assertEquals(pool.getNumActive(), 1);
- assertEquals(pool.getNumIdle(), 2);
-
- 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);
- }
分享到:
相关推荐
为了优化这一过程,我们可以考虑创建一个XMLHttpRequest对象池,复用这些对象而不是每次请求都新建。 首先,理解XMLHttpRequest的基本工作原理至关重要。当一个XHR对象被创建时,它会占用一定的系统资源,包括内存...
在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest 对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建...
ajax XMLHttpRequest。。。。。。
为了解决这个问题,我们可以构建一个XMLHttpRequest对象池,合理地复用这些对象,从而提高应用程序的效率。 对象池是一种设计模式,用于管理一组可重用的对象,避免了反复创建和销毁对象的开销。在JavaScript中,...
当涉及到大量并发请求时,XMLHttpRequest对象池的概念就变得重要了。浏览器会限制同一时刻可以发起的并发请求数量,以防止资源耗尽。对象池就是预先创建并缓存一定数量的XMLHttpRequest实例,当需要发送请求时,可以...
`说明.txt`文件可能是对Ajax对象池实现的详细解释或者使用指南,包括如何初始化对象池,如何从池中获取和归还Ajax对象,以及如何配置对象池的大小和回收策略等。通常,对象池的大小需要根据应用的实际需求进行调整,...
### 一页面多XMLHttpRequest对象知识点详解 #### 1. XMLHttpRequest与Ajax技术 - **XMLHttpRequest简介**:`XMLHttpRequest`是一种内置的JavaScript对象,它允许网页向服务器发送异步请求并处理响应,无需重新加载...
在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一...
.老生常谈—XmlHttpRequest 代码 代码如下: var xmlHttp; function createXmlHttpRequest() { if... } } 如果不用Jquery手写javascript,上面要改成XmlHttpRequest对象池,这就不写了。 .触发AutoComplete函数 代码
2. **Ajax请求**:利用JavaScript的XMLHttpRequest对象或者更现代的Fetch API,向服务器发送异步请求,携带用户名作为参数。 3. **服务器处理**:后端接收到请求,查询数据库中是否有相同的用户名。 4. **响应反馈**...
在ASP环境下,开发者可能使用XMLHttpRequest对象或者第三方库来模拟HTTP请求,获取网页内容,然后通过正则表达式或DOM解析技术提取所需信息,并将数据存储到数据库或文件中。 【ASP中的HTTP请求】在ASP中,可以使用...
1. **定义Pool类**:通过定义一个Pool类,我们可以创建一个XHR对象池。这个类中包含一些方法来管理XHR对象的创建、获取和重用。 2. **构造函数**:在Pool类的构造函数中,我们需要初始化一个数组`_cacheCase`,用于...
DWR允许JavaScript在用户的浏览器中直接调用服务器端的Java方法,这通过XMLHttpRequest对象实现了异步通信。DWR提供了一个自动化处理这些请求和响应的框架,减少了开发者处理低级Ajax细节的工作量。 在本示例中,...
`proxyPool` 属性是一个对象池,用于存储创建的XMLHttpRequest或XDomainRequest实例。`length`方法用于计算池中的对象数量,通过遍历池中的属性并减去1(因为属性`length`自身也计算在内)。 2. **索引和异步设置*...
它的核心在于利用JavaScript创建XMLHttpRequest对象,通过这个对象,可以在后台与服务器进行通信,无需刷新整个页面就能获取或发送数据。这一特性显著提升了用户体验,减少了服务器的负载,因为只需要传输必要的信息...