如何使javascript等待,直到它从同步http请求获得有效响应?
我知道使用同步请求不是一个好主意,但我确实需要它 如果响应长度小于20,我尝试让如何使javascript等待,直到它从同步http请求获得有效响应?,javascript,wait,synchronous,Javascript,Wait,Synchronous,我知道使用同步请求不是一个好主意,但我确实需要它 如果响应长度小于20,我尝试让getEndDate函数调用自身,但在第一个请求失败后(如果url给出的响应太短),它会进入警报(enddate.EDDAYOW)出现错误,getEndDate继续每500毫秒发送一次请求 我需要getEndDate函数继续发送请求,直到它得到有效响应并返回有效对象,然后才继续发送到JS的下一行。如何做到这一点 var url = 'http://local.com/cgi-bin/hello2.pl'; // ur
getEndDate
函数调用自身,但在第一个请求失败后(如果url给出的响应太短),它会进入警报(enddate.EDDAYOW)代码>出现错误,getEndDate
继续每500毫秒发送一次请求
我需要getEndDate
函数继续发送请求,直到它得到有效响应并返回有效对象,然后才继续发送到JS的下一行。如何做到这一点
var url = 'http://local.com/cgi-bin/hello2.pl';
// url returns a plain text:
// 1234567890 2013 05 May Friday 13 23 45 01
var enddate = getEndDate(url);
alert(enddate.EDDAYOW);
function getEndDate(url) {
var xmlhttp = getXmlHttp();
xmlhttp.open('GET', url, false);
xmlhttp.send();
if (xmlhttp.status == 200 && xmlhttp.responseText.length > 20) {
var n = xmlhttp.responseText.split(" ");
return {
'edseconds': n[0],
'EDYEAR': n[1],
'EDMON': n[2],
'EDMONNAME': n[3],
'EDDAYOW': n[4],
'EDDAY': n[5],
'EDHOUR': n[6],
'EDMIN': n[7],
'EDSEC': n[8]
};
} else {
setTimeout("getEndDate(" + url + ")", 500);
}
}
function getXmlHttp() {
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
我不知道这是否满足您的要求,但我会将其改写为以下内容:
var enddate;
getEndDate(url);
function do_rest(returnDate)
{
enddate = returnDate;
alert(enddate.EDDAYOW);
// do more if you need
};
function getEndDate(url) {
var xmlhttp = getXmlHttp();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200 && xmlhttp.responseText.length > 20) {
var n = xmlhttp.responseText.split(" ");
do_rest({
'edseconds': n[0],
'EDYEAR': n[1],
'EDMON': n[2],
'EDMONNAME': n[3],
'EDDAYOW': n[4],
'EDDAY': n[5],
'EDHOUR': n[6],
'EDMIN': n[7],
'EDSEC': n[8]
});
} else {
setTimeout("getEndDate(" + url + ")", 500);
}
}
}
xmlhttp.open('GET', url, false);
xmlhttp.send();
}
为什么您首先需要同步请求?@Blender,因为它应该在将页面打印到浏览器之前使用PHP代理从其他网站加载信息。那么您为什么不使用PHP进行此操作呢?我同意Blender,为什么?我担心的是,如果将此过程设置为锁定过程,则会挂起浏览器线程。在chrome中,这是(不好),但可以接受,因为您只会影响运行代码的选项卡,但在其他浏览器上,您可能会遇到问题。另外,您是否考虑过另一方面,如果您的回调服务关闭,会发生什么情况?您将得到一个无限循环,这绝不是一件好事。这里的答案可能会有所帮助:当url给出的响应少于20个字符时,它仍然失败:(我需要它一直发送请求,直到得到有效响应。@nixoid抱歉,我没有仔细查看您的代码。我认为您需要在readystatechange
上设置一个事件处理程序,并在其中处理响应。我认为在执行xmlhttp.send()
之后,您无法立即查看状态或任何内容。我修改了我的答案