Chrome 不处理 jquery ajax 查询

2024-04-12

我在 jquery 中有以下查询。它正在读取使用 Nginx 长轮询模块设置的 Nginx 订阅/发布对的“发布”地址。

function requestNextBroadcast() {
        // never stops - every reply triggers next. 
        // and silent errors restart via long timeout. 
        getxhr = $.ajax({
            url: "/activity",
            // dataType: 'json',
            data: "id="+channel,
            timeout: 46000, // must be longer than max heartbeat to only trigger after silent error. 
            error: function(jqXHR, textStatus, errorThrown) {
                alert("Background failed "+textStatus);  // should never happen 
                getxhr.abort(); 
                requestNextBroadcast();  // try again
            },
            success: function(reply, textStatus, jqXHR) {
                handleRequest(reply);   // this is the normal result. 
                requestNextBroadcast(); 
            }
        });
    }

该代码是聊天室的一部分。每条发送的消息都会以空 rply(200/OK)回复进行回复,但数据会被发布。这是数据返回时读取订阅地址的代码。

使用超时,聊天室中的所有人员每 30 到 40 秒发送一条简单消息,即使他们没有键入任何内容,因此此代码有大量数据可供读取 - 每 40 秒至少 2 条甚至可能更多消息。

该代码在 EI 和 Firefox 中 100% 坚如磐石。但在 Chrome 中读取大约 5 次失败。

当 Chrome 失败时,会出现 46 秒超时。

日志显示任一时间有一个未完成的 /activity 网络请求。

我已经爬行这段代码三天了,尝试各种想法。每次 IE 和 Firefox 工作正常,而 Chrome 却失败。

我看到的一个建议是使调用同步 - 但这显然是不可能的,因为它会锁定用户界面太长时间。

编辑 - 我有部分解决方案:代码现在是这样的

function requestNextBroadcast() {
    // never stops - every reply triggers next. 
    // and silent errors restart via long timeout. 
    getxhr = jQuery.ajax({
        url: "/activity",
        // dataType: 'json',
        data: "id="+channel,
        timeout: <?php echo $delay; ?>,
        error: function(jqXHR, textStatus, errorThrown) {
            window.status="GET error "+textStatus;
            setTimeout(requestNextBroadcast,20);  // try again
        },
        success: function(reply, textStatus, jqXHR) {
            handleRequest(reply);   // this is the normal result. 
            setTimeout(requestNextBroadcast,20); 
        }
    });
}

结果有时回复会延迟,直到 $delay (15000) 发生,然后排队的消息到达得太快而无法跟上。我无法使用这种新安排让它丢弃消息(仅在网络优化关闭的情况下进行测试)。

我非常怀疑延迟是由于网络问题造成的 - 所有机器都是我一台真机中的虚拟机,并且我的本地 LAN 没有其他用户。

编辑 2(英国夏令时星期五 2:30) - 更改代码以使用承诺 - 并且操作的 POST 开始显示相同的症状,但接收端开始正常工作! (???!!!???)。 这是 POST 例程 - 它正在处理一系列请求,以确保一次只有一个请求未完成。

function issuePostNow() {
    // reset heartbeat to dropout to send setTyping(false) in 30 to 40 seconds. 
    clearTimeout(dropoutat);
    dropoutat = setTimeout(function() {sendTyping(false);},  
                           30000 + 10000*Math.random()); 
    // and do send 
    var url = "handlechat.php?";
    if (postQueue.length > 0) {
        postData = postQueue[0];
        var postxhr = jQuery.ajax({ 
            type: 'POST',
            url: url,
            data: postData,
            timeout: 5000
        })
        postxhr.done(function(txt){
            postQueue.shift();  // remove this task
            if ((txt != null) && (txt.length > 0)) {
                alert("Error: unexpected post reply of: "+txt)
            }
            issuePostNow();
        });
        postxhr.fail(function(){
            alert(window.status="POST error "+postxhr.statusText);
            issuePostNow();
        });
    }
}

大约八分之一的操作对handlechat.php 的调用将超时并出现警报。一旦警报被确定,所有排队的消息都会到达。

我还注意到,handlechat 调用在写入其他人会看到的消息之前就停止了。我想知道这是否可能是 php 对会话数据的一些奇怪处理。我知道它会仔细地对调用进行排队,以便会话数据不会损坏,因此我一直小心地使用不同的浏览器或不同的机器。只有 2 个 php 工作线程,但是 php 不用于处理 /activity 或提供静态内容。

我还认为可能是 nginx 工作人员或 php 处理器短缺,所以我提出了这些问题。现在,让事情失败变得更加困难——但仍有可能。我的猜测是 /activity 调用现在失败率为 30 次,并且根本不会丢弃消息。

感谢大家的意见。


调查结果摘要。

1) 这是 Chrome 中的一个错误,该错误已经存在于代码中一段时间​​了。
2) 幸运的是,该错误可以显示为未发送的 POST,并且当超时时,Chrome 会处于重复 POST 将成功的状态。
3) 用于存储$.ajax()返回的变量可以是本地的或全局的。新的(承诺)和旧的格式调用都会触发该错误。
4)我还没有找到解决办法或避免该错误的方法。

Ian


我在 Chrome 上遇到了非常类似的问题。我正在进行 Ajax 调用,以便每秒从服务器获取时间。显然,Ajax 调用必须是异步的,因为如果不是异步的,它会在超时时冻结界面。但是,一旦其中一个 Ajax 调用失败,后续的每个调用也会失败。我首先尝试将超时设置为 100 毫秒,这在 IE 和 FF 中效果很好,但在 Chrome 中效果不佳。我最好的解决方案是将类型设置为 POST,这为我解决了 chrome 的错误:

   setInterval(function(){ 
      $.ajax({
         url: 'getTime.php',
         type: 'POST',
         async: true,
         timeout: 100,
         success: function() { console.log("success"); },
         error: function() { console.log("error"); }
       });
   }, 1000);

Update:我相信这里真正的根本问题是 Chrome 的缓存方式。似乎当一个请求失败时,该失败就会被缓存,因此后续请求永远不会发出,因为 Chrome 会在启动后续请求之前获取缓存的失败。如果您转到 Chrome 的开发人员工具并转到“网络”选项卡并检查发出的每个请求,就可以看到这一点。在失败之前,每秒都会向 getTime.php 发出 ajax 请求,但在 1 次失败之后,后续请求将不再发起。因此,以下解决方案对我有用:

   setInterval(function(){ 
      $.ajax({
         url: 'getTime.php',
         cache: false,
         async: true,
         timeout: 100,
         success: function() { console.log("success"); },
         error: function() { console.log("error"); }
       });
   }, 1000);

这里的变化是我禁用了对此 Ajax 查询的缓存,但为了做到这一点,类型选项必须是 GET 或 HEAD,这就是我删除 'type: 'POST''(默认为 GET)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chrome 不处理 jquery ajax 查询 的相关文章

  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 将 jquery-mobile 与 Webpack 结合使用

    我正在尝试使用 webpack 加载 jquery mobile 但到目前为止还没有运气 我知道 jquery mobile 依赖于 jquery ui 而 jquery ui 又依赖于 jquery 如何在 Webpack 中设置这样的场
  • Flask wtf.quick_form 运行一些 javascript 并设置表单变量

    我正在创建博客文章 到目前为止已经使用普通的 html 表单完成了 我所做的一个有趣的想法是运行 javascript onclick 并使用页面中的额外数据在表单中设置一个隐藏变量 这很好地传递到服务器并通过 request form 获
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • 何时不使用承诺[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在阅读了数十篇关于 es6 Promise 有多伟大以及为什么我们应该实现它们的文章之后 我有这样的感觉 ALL我的 不平凡的 JavaScri
  • 如何记录返回的事件发射器

    如何记录所发出的事件stream返回于MyFunc 与 JSDoc MyFunc description param Object opts description return Stream description function My
  • jQuery 验证规则和消息 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在设置 jQuery 验证的规则和
  • 通过docker使用Selenium python库,Chrome报错无法启动:异常退出

    我正在尝试使用以下命令运行一些 python 脚本selenium我从基于 miniconda anaconda 的 docker 容器中获取了库 但我不断收到此错误 selenium common exceptions WebDriver
  • 使react-leaflet能够离线使用

    我一直在使用反应传单 https github com PaulLeCam react leaflet图书馆 到目前为止运作良好 现在我希望网站预加载尽可能多的图块 以便网络应用程序 也是 PWA 可以在没有互联网的情况下使用 我找到了一些
  • HTML colorpicker 发生变化时如何获取新值?

    我正在开发一个需要更改 HTML 颜色的网络应用程序canvas基于的价值观colorpicker 我有一个colorpicker在我需要获取的 HTML 中value从每次更新开始
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • jQuery 选择下一个

    我有一个简单的div布局html 有一个函数 当鼠标悬停在className为 personal icon email 的div上时 我将调用JS函数并显示className为 img info mask 的隐藏div div class
  • 根据用户输入使用 Jquery 显示/隐藏字段

    li class numeric optional li
  • Jquery,清除/清空 tbody 元素的所有内容?

    我认为这会相当简单 但似乎空方法无法清除我拥有的 tbody 如果有人知道执行此操作的正确方法 我将不胜感激 我只想删除 tbody 中包含的所有内容 到目前为止我正在尝试 tbodyid empty HTML table tbody tr
  • window.showModalDialog 的等效跨浏览器解决方案是什么?

    window showModalDialog 的等效跨浏览器解决方案有哪些 showModalDialog 在 IE 和 FF 3 中引入 我个人认为没有 但是有很多 UI 工具包提供了这样的功能 例如jQuery UI http jque
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • Fancybox 画廊组

    我正在使用 fancyboxhttp fancyapps com fancybox http fancyapps com fancybox 我的问题是 我可以将不同的资源组合在一起吗 我的意思是同一画廊 或 组 中带有内嵌或视频的图像 如果
  • 有没有非常轻的灯箱? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 javascript 中使用 xPath 解析具有默认命名空间的 XML

    我需要创建一个 XML xPath 解析器 所有解析都必须在客户端进行 使用 JavaScript 我创建了一个 javascript 来执行此操作 在默认名称空间发挥作用之前 一切看起来都正常 我根本无法查询具有默认命名空间的 XML 我

随机推荐