javascript - 进行中的 Ajax 请求突然开始返回状态 = 0

标签 javascript php ajax xmlhttprequest

我有一个 PHP 网络项目,它访问一个使用 ReSTLet 框架的 Java 项目。 Web 项目在 Apache 上运行,我正在使用本地主机对其进行测试。 ReSTLet Framework同样使用localhost作为域,只是url略有不同:localhost:8888/

这是使用 Ajax 的 Javascript,它使用上面的 URL 调用其中一个 Java 类 (CollectionPublic)。

var url = "<?php echo $config['restServer_url'] ?>collectionPublic";

var params= "pageList="+facebookPages+"&time="+time;

var client = new XMLHttpRequest();
client.open("POST", url,true);
client.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

client.onreadystatechange = function () {

  if (client.readyState != 4) return;
  if (client.status != 200 && client.status != 304) {

       alert("error "+client.status);

 } else {
       alert("success");            

 }

 callback(client);
}

if (client.readyState == 4) return;
client.send(params);

我已经过测试,调用正确,使用 URL localhost:8888/collectionPublic,它正在到达 CollectionPublic 类(该类工作正常)。

问题是:进行此调用时,CollectionPublic 类需要很长时间才能完成其任务,并且用户应该能够访问其他页面(在同一台服务器上)或重新加载该页面。然而,当这些事情中的任何一个发生时,就会弹出 alert("error "+client.status) 并且 client.status 的值为 0。然后调用中止,但是 CollectionPublic 的任务正常继续,当它完成时,网页中没有任何反应(之前,警报(“成功”)被触发)。

我花了几个小时试图找出导致错误的原因,因为这是上周的工作。我发现的大多数帖子都说这可能是跨源资源问题,因为 localhost 和 localhost:8888 不被视为同一个域。为了查看这是否真的是问题所在,我使用 --disable-web-security 参数启动了 Chrome(它确实被禁用了),但问题仍然存在。 最奇怪的是它以前工作过,我在代码中完全没有改变。

我看过这个帖子Reloading page while an Ajax request in progress gives empty response and status as zero它似乎与我面临的情况非常相似。

希望我已经说清楚了,但如果您对此问题有任何疑问,请尽管提问。

非常感谢。

最佳答案

我不相信 ajax 请求本身是完全正确的。 if (client.readyState != 4) return; 将始终为真,除了实际为 4 时。这可能更好:

client.onreadystatechange = function () {
    if(client.readyState < 4) {  
        //not complete yet
        return;  
    }  

    if(client.status != 200 && client.status != 304) {  
        //an error
        alert("error "+client.status);
        return;  
    } 

    if(client.readyState === 4) {  
        //complete
        callback(client);  
    }
}

至于 ajax 调用被中止的问题:这是正确的行为。一旦页面重新加载或卸载,所有 XHR 调用将被浏览器中止。在本地查看页面时,情况可能并非如此。我不允许用户在 ajax 进行时离开(或重新加载)。作为变通方法,您的类可以设置一个由您的页面读取的 session 变量。

关于javascript - 进行中的 Ajax 请求突然开始返回状态 = 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18488174/

相关文章:

javascript - 如何使用 javascript 在单击时将 html 表单字段值复制到另一个字段?

javascript - 使用 ajax 和 PHP 裁剪后将图像保存到 MySQL

javascript - 将所有 JavaScript 语句输出到控制台

php - 全局辅助函数应该命名空间吗?

php - 如何在外部域中使用 jQuery AJAX?

javascript - 刷新(重新发送)xmlhttp 请求在 IE 浏览器中不起作用

javascript - 可能清除 jquery `one` 方法

php - 我如何使用 php 和 codeigniter 将数据插入数据库

javascript - 如何清除javascript函数中的超时

jquery - window.history.pushState 不会回到历史