Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在进行的Ajax请求突然开始返回状态=0_Javascript_Php_Ajax_Xmlhttprequest - Fatal编程技术网

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

Javascript 正在进行的Ajax请求突然开始返回状态=0,javascript,php,ajax,xmlhttprequest,Javascript,Php,Ajax,Xmlhttprequest,我有一个PHP的web项目,它访问一个使用Restlet框架的Java项目。web项目在Apache上运行,我正在使用localhost对其进行测试。Restlet框架也使用localhost作为域,但是url略有不同:localhost:8888/ 这就是Javascript,它使用Ajax,使用上面的URL调用一个Java类(CollectionPublic) var url = "<?php echo $config['restServer_url'] ?>collection

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

这就是Javascript,它使用Ajax,使用上面的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);
var url=“collectionPublic”;
var params=“pageList=“+facebookPages+”&time=“+time;
var client=new XMLHttpRequest();
client.open(“POST”,url,true);
setRequestHeader(“内容类型”、“应用程序/x-www-form-urlencoded”);
client.onreadystatechange=函数(){
如果(client.readyState!=4)返回;
if(client.status!=200&&client.status!=304){
警报(“错误”+客户端状态);
}否则{
警惕(“成功”);
}
回拨(客户机);
}
if(client.readyState==4)返回;
client.send(params);
我已经进行了测试,并且使用URL localhost:8888/collectionPublic正确地进行了调用,它正在到达collectionPublic类(该类工作正常)

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

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

我看过这篇文章,它看起来和我面临的很相似

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


提前非常感谢。

我不相信ajax请求本身是正确的<代码>如果(client.readyState!=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);  
    }
}
client.onreadystatechange=函数(){
如果(client.readyState<4){
//尚未完成
返回;
}  
如果(client.status!=200&&client.status!=304){
//错误
警报(“错误”+客户端状态);
返回;
} 
如果(client.readyState==4){
//完整的
回拨(客户机);
}
}

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

谢谢您的建议。我从client.readyState更改了4,致client.readyState<4,但这并没有影响我的问题。对此有什么建议吗?但在这种情况下,我认为用户能够导航或重新加载是合理的,因为Java类运行的任务需要一段时间才能完成。我在许多论坛上看到,当页面重新加载时,所有XHR调用都将被中止,但情况是,它以前工作过!这可能与上面所说的有关:但我仍然无法找到是否有一个很小的细节与正在运行的版本不同。readyState为4,但状态为0,这对我来说意味着一个跨域策略问题。这可能与浏览器本身有关吗?因为我很确定它上周起作用了,但现在不行了,可能是因为有什么更新。虽然我在Safari、Chrome和Firefox上进行了测试。谢谢你的回复,Moob。我已经在谷歌上搜索了一百万个与这个问题相关的东西,但到目前为止都没有成功:(跨域问题确实非常可疑,尽管在启动Chrome时禁用web安全性的论点本可以“解决”这个问题,但事实并非如此。