【问题标题】:ajax call is sometimes cancelled by chromeajax 调用有时会被 chrome 取消
【发布时间】:2017-06-21 10:44:14
【问题描述】:

我的ajax代码是

var auto_refresh = setInterval(function () {
    $.ajax({
            type: 'post',
            url: 'lib/nav.php',
            data: 'c=autchk',
            success: function (result) {
                $('#test-div').html(result);
            },
            error: function (jqXHR, textStatus, errorThrown) {
                // I don't know how to display error message
                console.log('Error: '+jqXHR+' '+textStatus+' '+errorThrown);
            }
        });
}, 9000);

请求有时会在超时之前被取消。 在 chrome 日志中,取消请求的状态是停滞的。然后我阅读了导致我这样做的解释

排队。浏览器在以下情况下对请求进行排队:

  • 有更高优先级的请求。
  • 已经有六个 TCP 为这个来源打开的连接,这是限制。适用于 仅限 HTTP/1.0 和 HTTP/1.1。

停滞不前。请求可能由于排队中描述的任何原因而停止。

问题是因为这个还是其他原因?

编辑:

我在 3 个浏览器中测试代码

我在 Microsoft Edge 中没有看到任何已取消的请求。 Chrome 中的内容比 Firefox 更多。

【问题讨论】:

  • 对于浏览器中的 ajax 请求,您有限制,它取决于浏览器,例如对于 chrome 浏览器,它在一段时间内大约有 8 个 ajax 请求。请让您以书面方式使用 ajax 请求。
  • @Farhad 那么如何修复我的代码以便 chrome 不会取消我的请求?
  • 你为什么要使用超时!! .请解释一下你打算用那个 ajax 做什么
  • 我删除了超时,有时它会在 9 秒内失败。我使用超时是因为我担心是否会有多个 ajax 请求会减慢连接速度。对不起,如果我错了。我想要做的是我想检查数据库中的新输入然后做一些关于它的通知。我的代码做错了吗?

标签: javascript jquery ajax google-chrome


【解决方案1】:

所有浏览器都限制了对同一来源的并发调用,已经有很好的讨论:Max parallel http connections in a browser?

问题是您以错误的方式实现自动刷新, 您正在使用的正在调用:Polling,您基本上会定期调用服务器,但有时可能会发生您已经有其他调用正在进行中的情况,这将导致取消。

轮询是一种非常古老的方法,您应该看看WebSockets 或Server Side Events,这绝对是处理服务器端更改并将其反映到 UI 中的最佳方法。

如果您无法实现它们,那么您可能需要Long Polling Strategy,这是一种古老但仍然有价值的方法。

还有其他信息:What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?

function auto_refresh(onSuccess, onError, onEnd, rate, times) {
  onSuccess = onSuccess || $.noop;
  onError = onError || $.noop;
  onEnd = onEnd || $.noop;
  
  rate = Number(rate) || 9000;
  times = Number(times) || Infinity
  
  function iteration() {
    return $
      .post('lib/nav.php', 'c=autchk')
      .then(onSuccess)
      .fail(onError)
      .always(function() {
        if(Number.isFinite(times)) {
          times -= 1;

          if(times <= 0) {
            return onEnd();
          }
        }

        return auto_refresh(onSuccess, onError, onEnd, rate, times);
      })
    ;
  }
  
  return window.setTimeout(iteration, rate);
}


auto_refresh(function(result) {
  return $('#test-div').html(result).promise();
});
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 我将在我的下一个项目中实施您的建议,但现在也许我会坚持这种技术。谢谢...
  • 那么你最终会得到一些取消,但是,要记住的另一件事是有时服务器无话可说,但客户端会保留调用,这将消耗不需要的资源(带宽、计算时间、ecc。)并且会严重影响您的性能。
  • 您还可以根据我上次的编辑调整您的代码(我添加了一个 sn-p)。
  • 非常感谢。我删除了 Infinite 东西以使该代码正常工作。
  • 打错字了,应该是Infinity(总是执行请求)
猜你喜欢
  • 1970-01-01
  • 2019-04-21
  • 2014-09-08
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多