【问题标题】:jQuery AJAX request slow even though all previous requests aborted即使所有先前的请求都中止了,jQuery AJAX 请求也很慢
【发布时间】:2010-08-15 00:37:51
【问题描述】:

我有一个搜索过滤器,它会触发一个 ajax 请求以在更改过滤器时更新结果集。通常情况下,用户会一次性更改许多过滤器,从而触发许多 AJAX 请求。

所以我决定在发出新请求时中止先前的请求(通过使用 ajax.abort() 函数)。现在... Firebug 将所有这些请求显示为已中止,但最后一个请求(唯一未中止的请求)在它之前的中止请求越多,所需的时间就越长。

因此,例如,如果我只更改一个过滤器,则加载请求需要 1 秒。但是,如果我一次更改 5 个过滤器,它会中止其中的 4 个,只留下最后一个请求。但是,此请求最终需要 5 秒才能完成。

有人知道这是为什么吗?我猜即使 jQuery 中止了请求,我的服务器仍在处理它? (我在开发模式下运行本地 Rails Mongrel,仅供参考)这有点破坏了我中止请求的全部原因......我能做些什么来解决这个问题??

非常感谢您的帮助!

【问题讨论】:

  • 你确定服务器还没有处理那些之前的请求,是那一方陷入了困境吗?
  • 正如 Nick Craver 所暗示的,取消 AJAX 请求只会破坏回调处理程序 - 您的页面将忽略任何传入信息。但是,只要您发送 AJAX 请求,该请求就已经发送到服务器进行处理。但是,除非您的服务器流量很大或速度很慢,否则这不太可能是问题。
  • hmmm 所以我把它推送到我的生产服务器上,它工作得很好——也就是说,这不是问题,因为服务器的响应速度比我点击过滤器的速度要快。就像你说的,只有本地开发服务器慢的问题。仍然,似乎应该有更好的方法来做到这一点(为什么我们的服务器需要处理未使用的请求?)也许我会尝试延迟请求的安迪回答......

标签: ruby-on-rails ajax jquery


【解决方案1】:

如果用户的搜索参数被快速输入,您可能想尝试延迟请求的方法。例如,在我的一个应用程序中,我等到用户停止了半秒。

  $("#user_login").keypress(function() {
    var login = this;
    if (this.value != this.lastValue) {
      $("#loading_small").addClass("loading-small");
      if (this.timer) { clearTimeout(this.timer); }
      this.timer = setTimeout(function() { 
        $.get("/users/login_validate", $(login).serialize(), function(data) {
          $("#loading_small").removeClass("loading-small");
          $("#login_valid").fadeIn().html(data);
        });
      }, 500);
    }
  });

【讨论】:

  • 听起来是个不错的解决方案。在我看来,这更像是一种黑客攻击......我觉得应该有一种方法可以告诉服务器停止处理这些请求......但我猜没有。一堆无用的请求肯定会导致扩展问题?
  • 我不确定我是否称其为 hack - 它基本上是“在发出请求之前等待用户停止输入半秒(或多长时间)。”我更喜欢这样向服务器发送更多请求,告诉它取消旧请求。
猜你喜欢
  • 2014-10-15
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多