正在进行的Ajax请求突然开始返回status = 0

时间:2013-08-28 12:39:27

标签: php javascript ajax xmlhttprequest cors

我在PHP中有一个Web项目,它访问使用Restlet Framework的Java项目。 Web项目在Apache上运行,我正在使用localhost对其进行测试。 Restlet Framework也使用localhost作为域,但url略有不同:localhost:8888 /

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

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类需要很长时间才能完成其任务,并且用户应该能够访问其他页面(在同一服务器上)或重新加载页面。但是,当这些事情发生时,会弹出警报(“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,它看起来与我所面对的非常相似。

希望我已经说清楚了,但如果您对这个问题有任何疑问,请问。

提前多多感谢。

1 个答案:

答案 0 :(得分:0)

我不相信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正在进行时,我不允许用户导航(或重新加载)。作为解决方法,您的类可以设置由您的页面读取的会话变量。