AJAX连接池怎么传递xmlhttprequest对象给函数

budgerigar 2009-04-19 04:26:46
小弟不才,在学习ajax的时候遇到下面一个问题,找了好久都没有好的解决办法,请各位不吝赐教
连接池的代码:
sendReq: function (method, url, data,func,func_arr)
{
var objXMLHttp = this._getInstance();
alert(objXMLHttp);
with(objXMLHttp)
{
try
{
// 加随机数防止缓存
if (url.indexOf("?") > 0)
{
url += "&randnum=" + Math.random();
}
else
{
url += "?randnum=" + Math.random();
}

open(method, url, true);

// 设定请求编码方式
setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
send(data);
onreadystatechange = func1;
}
catch(e)
{
alert(e);
}
}
}

onreadystatechange不能传递这个sendreq中的xmlhttprequest对象给函数,所以在下面判断返回文本的时候总是提示找不到对象。有一个笨的方法就是每个调用函数都和xmlhttprequest对象创建的语句在一个函数内,不过这样如果有很多个函数的话,就浪费了很多代码,如果能直接调用的话重用性就高多了,代码如下,不知道各位有没有更好的方法
func1: function (method, url, data,func,func_arr)
{
var objXMLHttp = this._getInstance();
alert(objXMLHttp);
with(objXMLHttp)
{
try
{
// 加随机数防止缓存
if (url.indexOf("?") > 0)
{
url += "&randnum=" + Math.random();
}
else
{
url += "?randnum=" + Math.random();
}

open(method, url, true);

// 设定请求编码方式
setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
send(data);
onreadystatechange = function(){
function_content;
}
}
catch(e)
{
alert(e);
}
}
}
...全文
218 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
budgerigar 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yudylaw 的回复:]
xmlHttp 连接池,你这个是表述错误
[/Quote]
请问哪里错误,我不太明白
budgerigar 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 aokihu 的回复:]
当xmlhttprequest对象成功返回数据时,结果不是保存在xmlhttprequest.responseText和xmlhttprequestXML中嘛
如果要做成像其他框架那样的话,在返回函数中不要用xmlhttprequest.responseText和xmlhttprequestXML直接获取结果,而是将它们作为回调函数的参数

解释下单例模式,单例模式就是说虽然你有很多个类的示例,而这些实例中的某个属性是大家共有的,但是又不想做成静态共享,同时还想尽可能减少资源,这时候就可以用单例…
[/Quote]
先感谢一下,感觉自己现在基础还是不行,把responseText当前参数让我有一种茅塞顿开的感觉,我是不是也可以这样,把返回的状态也当做参数传入,就可以判断返回的状态是否正确?我去试下!
还有单例模式是不是就是用一个全局变量连接服务器,每次只能同时发出一个连接?
如果不是,如何保证发出的连接前后不会冲突造成数据接收错误?
yudylaw 2009-04-22
  • 打赏
  • 举报
回复
xmlHttp 连接池,你这个是表述错误
aokihu 2009-04-21
  • 打赏
  • 举报
回复
当xmlhttprequest对象成功返回数据时,结果不是保存在xmlhttprequest.responseText和xmlhttprequestXML中嘛
如果要做成像其他框架那样的话,在返回函数中不要用xmlhttprequest.responseText和xmlhttprequestXML直接获取结果,而是将它们作为回调函数的参数

解释下单例模式,单例模式就是说虽然你有很多个类的示例,而这些实例中的某个属性是大家共有的,但是又不想做成静态共享,同时还想尽可能减少资源,这时候就可以用单例模式

function request()
{
if(null == request.XHR)
{
request.XHR = new XMLHttpRequest();
}

//你的其他代码
request.XHR.open(...);
request.XHR.send();
...
}

像这样,request中有个XHR的全局对象保存了Xmlhttprequest对象,你在实例中调用也是使用这个全局对象,而不是新建一个实例
这样就可以了

而回调函数中的参数
request.XHR.onreadtstatechange = function(){callback(request.XHR.responseText)}

这样写,就可以直接传递回调函数返回的结果,包装效果好
aokihu 2009-04-21
  • 打赏
  • 举报
回复
当xmlhttprequest对象成功返回数据时,结果不是保存在xmlhttprequest.responseText和xmlhttprequestXML中嘛
如果要做成像其他框架那样的话,在返回函数中不要用xmlhttprequest.responseText和xmlhttprequestXML直接获取结果,而是将它们作为回调函数的参数

解释下单例模式,单例模式就是说虽然你有很多个类的示例,而这些实例中的某个属性是大家共有的,但是又不想做成静态共享,同时还想尽可能减少资源,这时候就可以用单例模式

function request()
{
if(null == request.XHR)
{
request.XHR = new XMLHttpRequest();
}

//你的其他代码
request.XHR.open(...);
request.XHR.send();
...
}

像这样,request中有个XHR的全局对象保存了Xmlhttprequest对象,你在实例中调用也是使用这个全局对象,而不是新建一个实例
这样就可以了

而回调函数中的参数
request.XHR.onreadtstatechange = function(){callback(request.XHR.responseText)}

这样写,就可以直接传递回调函数返回的结果,包装效果好
aokihu 2009-04-21
  • 打赏
  • 举报
回复
哪有什么连接池,就是全局一个xmlhttprequest对象,使用了单例模式,不要把微软的那一套搬过来,能够一个实现的不要多个
budgerigar 2009-04-21
  • 打赏
  • 举报
回复
这个必须要用连接池的,因为一个页面发送的请求太多,还有

你在回调函数中一个参数是请求的回复信息就好了,很多框架就是这么做的

这句话不太明白,能解释下吗,谢谢
aokihu 2009-04-20
  • 打赏
  • 举报
回复
你有看过你的代码作用域范围了吗?
你的xmlhttp对象作用域只在这个函数内,该函数以外的部分不能访问,所以不能被调用
建议你使用全局的XMLhttp对象,可以使用单实例方式实现,跟你这样效果差不多
还有个方法,你在回调函数中一个参数是请求的回复信息就好了,很多框架就是这么做的

52,782

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧