HTTPool是XMLHTTP封装类,除了异步交互数据外增加了进程池的功能,进程池中存放着正在数据交互的进程,等待交互的进程,交互完毕的进程。 HTTPool的进程池初始是空的,有交互请求时,会检查池中是否有已交互完毕的进程,如果没有将会创建新的进程,并进入进程池。
交互完毕,HTTPool会调用进程的回调函数,进程变为交互完毕状态,可以被以后的交互请求所使用。
如果请求交互时进程池中活跃进程已达到最大值,会进入等待队列,一旦有进程交互完成或超时取消,将会启动最早进入等待队列的进程。
HTTPool会实时检查正在交互的进程数目,如果有进程超时,将会中止进程的交互操作,进入交互完毕状态,可以被以后的交互请求使用。
下载:HTTPoolv0.1.ZIP 、HTTPoolv0.1_min.js 、HTTPoolv0.1.js
HTTPool封装类代码可以使用在开源或商业软件上,可以随意下载和传播,但是必须在代码中保留版权信息。
HTTPool.len()
功能:获取当前池中进程数目。
参数:无
功能:获取进程池中正在交互的进程数目。
参数:无
返回值:进程数目。
功能:获取进程池中正在等待的进程数目。
参数:无
返回值:进程数目。
功能:获取或设置进程池最大长度配置,建议为25,视交互需要而定,建议不要太大。
参数:整数,可缺省,缺省为25。
返回值:进程池最大长度。
功能:获取或设置活跃进程最大数配置,建议为5个,如果考虑老版本浏览器可以改为2。
参数:整数,可缺省,缺省为5。
返回值:活跃对象最大数。
功能:获取或设置进程超时限制配置,建议为10秒,视情况而定。
参数:整数,单位秒,可缺省,缺省为4。
返回值:进程池最大长度。
功能:获取下一个进程ID,此ID用于等待队列的排队和请求数统计,调用此方法后下一个进程PID会自动加1。
参数:无
返回值:下一个进程ID。
功能:获取一个进程对象。
参数:无
返回值:进程对象。
如:
var obj = HTTPool.getHTTP();
obj.url = 'time.php?' + Math.random();
obj.method = "GET";
obj.callback = OKTest;
obj.callBackError = errTest;
obj.PID = HTTPool.PID(); // 设置进程ID,参考HTTPool.PID()的说明。
obj.arg = i;
obj.wait = true; // 设置进入等待队列,如果正在交互的进程数没有达到最大值,将会在0.1秒内启动此进程。
// HTTPool.sendRequest(obj); // 直接启动此进程,无视进程数最大值
属性和HTTPool.send的参数保持一致,参考HTTPool.send的参数说明。
这种进程对象方式等同于使用HTTPool.sendGet()或HTTPool.send()。
功能:启动进程交互。此操作不理会进程池的活跃进程是否达到最大数,在请求数比较多时慎用。
参数:
o,进程对象,可以把HTTPool.getHTTP()方法获取的进程对象修改属性后用此方法启动。
返回值:无
功能:清空进程池。
参数:无
返回值:无
HTTPool.send(url, method, callback, data, urlencoded, callBackError)
功能:接受交互请求,如果进程池中正在交互的进程达数到最大值,将请求放入等待队列,否则进行数据交互。
参数:
url,字符串,进行数据交互的URL地址。
method,字符串,GET或POST,交互类型。
callback,函数,交互完成将会调用此函数,可以缺省。
data,字符串,交互类型是POST,data将作为POST的数据处理,否则无效。
urlencoded,布尔值,是否设置HTTP头带有URL编码类型,POST类型才有效,可缺省。
callBackError,函数,当发生超时或错误时调用此函数,可以缺省。
返回值:无
功能:接受GET请求,HTTPool.send的简化版,功能参照HTTPool.send。
参数:
url,字符串,进行数据交互的URL地址。
callback,函数,交互完成将会调用此函数。
callBackError,函数,当发生超时或错误时调用此函数。
返回值:无
功能:接受POST请求,HTTPool.send的简化版,功能参照HTTPool.send。
参数:
url,字符串,进行数据交互的URL地址。
callback,函数,交互完成将会调用此函数。
data,字符串,交互类型是POST,data将作为POST的数据处理,否则无效。
callBackError,函数,当发生超时或错误时调用此函数。
返回值:无
回调函数将会获得一个参数,参数是一个XMLHTTP对象的引用,可以用对象的属性responseText或responseXML获取返回数据。
function OKTest(s, arg) {
document.getElementById('outHTML').innerHTML += " " + arg + " callback data:" + s.responseText;
}
function errTest(s, arg) {
document.getElementById('outHTML').innerHTML += " " + arg + " errcallback";
}
HTTPool.sendGet('time.php?' + Math.random(), 1, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 2, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 3, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 4, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 5, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 6, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 7, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 8, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 9, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 10, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 11, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 12, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 13, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 14, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 15, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 16, OKTest, errTest);
HTTPool.sendGet('time.php?' + Math.random(), 17, OKTest, errTest);
同时向HTTPool对象提出17个交互请求,HTTPool对象会根据提出的先后顺序安排交互。
测试用的time.php代码:
<?php
$rand = rand(1, 8);
sleep($rand);// 暂停上面得到的随机的秒数,1~8
echo $rand;
?>
IE7下的HTTPWatch截屏:
Firefox3.6下的firebug截屏:
chrome开发工具截屏:
Opera截屏:
1 callback data:1
4 callback data:3
5 callback data:2
0 errcallback
2 errcallback
3 callback data:4
6 errcallback
7 errcallback
8 errcallback
9 errcallback
10 errcallback
11 callback data:2
12 errcallback
13 errcallback
14 errcallback
15 callback data:4
18 callback data:1
19 callback data:1
17 callback data:2
16 callback data:4