我正在开发一个使用ANT Galio浏览器在嵌入式设备上运行的JavaScript代码。
理想情况下,我希望代码向另一台服务器发出get请求。在发出get请求之后,页面将不允许用户提交另一个get请求,直到从先前的get请求收到响应。
出于某种原因,有时我几乎立即收到了readyState为4。就好像它正在评估之前的XmlHttpRequest对象而不是新对象。我做错了什么?
<script type="text/javascript">
var fail= function (env, resp, stat) {
alert(resp);
};
var succ= function (env, resp) {
};
var canScan = true;
/* start scan */
function scan (name) {
if (canScan) {
//deactivate button
deactivateScanButtons();
//let server know
ajax = new XMLHttpRequest();
var scanUrl = 'http://19X.1XX.X.XX:8080/scan/' + name
ajax.open('GET', scanUrl, true);
ajax.onreadystatechange = function() {
if (ajax.readyState==4) {
//allow button to work again
activateScanButtons();
alert("ready state 4");
};
};
ajax.send();
//initiate scan
xrxScanInitiateScan(
'http://127.0.0.1',
"ftp.xst",
false,
succ,
fail);
}
}
function deactivateScanButtons () {
// canScan = false;
var indicator = document.getElementById('buttons');
indicator.style.visibility = "hidden";
}
function activateScanButtons () {
// canScan = true;
var indicator = document.getElementById('buttons');
indicator.style.visibility = "visible";
}
</script>
答案 0 :(得分:1)
您可以在scan
函数中定义ajax对象,而不使用var
关键字。这意味着它是一个全局对象,而不是本地对象。之后,你有一个闭包 - 你在onreadystate
回调函数中引用该变量。
我发现很难准确跟踪那里发生了什么,但我同意你的意见,正如你在问题中所说,回调并没有像你期望的那样使用ajax对象。你说它有时会发生 - 当你几乎同时发出两个请求时会发生这种情况(双击按钮或者以非常快的速度触发两个请求)?
我建议您在定义ajax对象之前使用var
关键字。更好的是,尝试在回调函数中使用this
,而不是按名称引用ajax对象。如果它有效,你可以省去一个封闭。
答案 1 :(得分:1)
3条建议:
XMLHttpRequest
关键字启动您的var
对象。onreadystatechange
中,仅当全局时间戳与该给定请求的相应时间戳匹配时才调用activateScanButtons
。这样,只有最新的请求才能调用activateScanButtons
。