【问题标题】:Ajax Request in Progress suddenly started returning status = 0正在进行的 Ajax 请求突然开始返回状态 = 0
【发布时间】:2019-12-29 06:27:39
【问题描述】:

我有一个 PHP 网络项目,它访问一个使用 Restlet 框架的 Java 项目。 Web 项目在 Apache 上运行,我正在使用 localhost 对其进行测试。 Restlet 框架也使用 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 类需要很长时间才能完成其任务,并且用户应该能够访问其他页面(在同一服务器上)或重新加载页面。然而,当这两种情况发生时,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,看起来和我所面对的很相似。

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

非常感谢。

【问题讨论】:

    标签: javascript php ajax xmlhttprequest


    【解决方案1】:

    我不相信 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 进行时导航离开(或重新加载)。作为一种变通方法,您的类可以设置一个由您的页面读取的会话变量。

    【讨论】:

    • 感谢您的建议。我从 client.readyState != 4 更改为 client.readyState
    • 但是在这种情况下,我认为用户能够导航离开或重新加载是合理的,因为 Java 类运行的任务需要一段时间才能完成。我在许多论坛上看到重新加载页面时所有 XHR 调用都会中止,但情况是它以前可以工作!这可能与上面所说的有关:ajaxian.com/archives/xmlhttprequest-and-status-code-0 但我仍然无法找到是否有一个微小的细节与正在运行的版本有所不同。
    • readyState 为 4 但状态为 0 表明我存在跨域策略问题。
    • 会不会和浏览器本身有关?因为我很确定它上周可以正常工作,但现在不行了,也许是由于某些事情的更新。虽然我在 Safari、Chrome 和 Firefox 上进行了测试。
    • 感谢您的回复,Moob。我已经尝试在谷歌上搜索与此问题相关的一百万条内容,但到目前为止还没有运气:( 跨域问题确实非常可疑,尽管启动 Chrome 时的参数 --disable-web-security 会“解决”问题,但它没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2021-10-20
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多