首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ajax请求正在进行中突然开始返回状态=0

Ajax请求正在进行中突然开始返回状态=0
EN

Stack Overflow用户
提问于 2013-08-28 20:39:27
回答 1查看 462关注 0票数 2

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

这是使用Ajax的Javascript,它使用上面的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上看到了这篇文章,它看起来和我所面对的非常相似。

希望我已经说得很清楚了,但是如果你对这个问题有任何疑问,请尽管问。

在此之前非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2013-08-28 21:08:43

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

代码语言:javascript
复制
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运行过程中离开(或重新加载)。作为一种解决办法,您的类可以设置一个由您的页面读取的会话变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18488174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档