【问题标题】:XmlHttpRequest returning state 4 too soonXmlHttpRequest 过早返回状态 4
【发布时间】:2011-04-10 03:32:42
【问题描述】:

我正在使用 ANT Galio 浏览器开发一个在嵌入式设备上运行的 javascript 代码。

理想情况下,我希望代码向另一台服务器发出 get 请求。发出该 get 请求后,该页面将不允许用户提交另一个 get 请求,直到收到来自先前 get 请求的响应。

由于某种原因,有时我几乎立即收到 4 的 readyState。就好像它正在评估以前的 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>

【问题讨论】:

    标签: javascript xmlhttprequest xmlhttprequest-states


    【解决方案1】:

    3 条建议:

    1. 为避免在客户端进行任何缓存,请在请求查询字符串中添加一个随机生成的数字或当前时间戳。
    2. 正如 Yoni 所说,使用 var 关键字启动您的 XMLHttpRequest 对象。
    3. 对于每个请求,将当前时间戳保存在全局变量中。在onreadystatechange 中,仅当全局时间戳与给定请求的相应时间戳匹配时才调用activateScanButtons。这样,只有最新的请求才能调用activateScanButtons

    【讨论】:

      【解决方案2】:

      您在 scan 函数中定义 ajax 对象之前没有 var 关键字。这意味着它是一个全局对象,而不是本地对象。之后,您有一个闭包 - 您在 onreadystate 回调函数中引用该变量。

      我发现很难准确跟踪那里发生了什么,但我同意你的观点,正如你在问题中所说,回调没有按照你期望的方式使用 ajax 对象。您说它有时会发生 - 当您几乎同时发出两个请求时会发生这种情况(双击按钮或以其他方式非常快速地触发两个 get 请求)?

      我建议您在定义 ajax 对象之前使用var 关键字。更好的是,尝试在回调函数中使用this,而不是按名称引用ajax 对象。如果它有效,那么您就避免了一次关闭。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多