我有一个使用服务器执行Ajax请求的功能。代码有效但由于某种原因阻塞了js代码的其余部分。所以我必须等到请求结束。这真的很奇怪,因为ajax本质上是异步的。任何帮助将不胜感激。
这是代码
function initRequest(url)
{
var xmlhttp = null;
if(xmlhttp != null)
{
if(xmlhttp.abort)
xmlhttp.abort();
xmlhttp = null;
};
if(window.XMLHttpRequest) // good browsers
xmlhttp=new XMLHttpRequest();
else if(window.ActiveXObject) // IE
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
if(xmlhttp == null)
return null;
xmlhttp.open("GET",url,false);
xmlhttp.send(null);
if(xmlhttp.status >= 200 && xmlhttp.status < 300)// 2xx is good enough
return xmlhttp.responseText.split("|");
else
return null;
}
我这样称呼这个函数 var res = initRequest('someurl'); if(res){console.log(res); } console.log('当请求被提供时会出现此消息!!为什么?');
答案 0 :(得分:2)
您应该在XMLHttpRequest对象上实现onreadystatechange回调并检查其中的状态更改,而不是等待阻塞服务器的响应。这个方法将在readyStatus属性的每次更改时被调用,并且在你调用xmlhttp.send(...)之后将(希望)在某个时刻返回200;
编辑:所以你的代码看起来像是
function initRequest(url, onsuccess, onerror) {
// ...
xmlhttp.onreadystatechange = function () {
if(this.status >= 200 && this.status < 300) {// 2xx is good enough
onsuccess(this.responseText.split("|"));
}
};
xmlhttp.open("GET", url); // its asynchronous by default
xmlhttp.send(null);
}
为了衡量一些有用的链接 http://www.w3.org/TR/XMLHttpRequest1/和https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
答案 1 :(得分:1)
xmlhttp.open("GET",url,false);
中的第三个参数是是否异步发送请求。由于你输入false,它会同步运行,这就是它阻止你的代码的原因。
为了使此异步,您应该将第三个参数更改为true
,然后添加一个函数给xmlhttp.onreadystatechange
,该函数将作为异步请求的回调(在您调用{之前执行此操作) {1}}。
另一个需要考虑的重要事项是,由于这是异步的,因此您不希望从ajax请求中返回一个值,因为您将等待该返回值,这意味着它将无法获取返回值,或者你必须阻止一切,我们回到原来的问题。因此,考虑一下你想用ajax响应做什么。您可以直接将此代码编码为您分配给.send()
的任何内容,或者您可以使用闭包将回调传递给它,例如
xmlhttp.onreadystatechange
然后,无论你在哪里调用function initRequest(url, callback)
{
...
xmlhttp.open("GET",url,true);
xmlhttp.onreadystatechange = (function(cb) {
return function() {
if(xmlhttp.status >= 200 && xmlhttp.status < 300)// 2xx is good enough
{
cb(xmlhttp.responseText.split("|"));
}
};
)(callback);
xmlhttp.send(null);
}
,都要定义一个能对结果做某事的函数,然后将其作为第二个参数传递,例如
initRequest
请告诉我这是否有意义,或者如果您有任何疑问:)
答案 2 :(得分:0)
请将 ajax请求从synchronous
更改为asynchronous
,然后尝试,
发件人,
xmlhttp.open("GET",url,false);
收件人,
xmlhttp.onreadystatechange = function () {
if(this.status >= 200 && this.status < 300) {// 2xx is good enough
}
}
xmlhttp.open("GET",url,true);