2010-08-15 96 views
3

我有一个搜索过滤器,可以在更改过滤器时触发ajax请求来更新结果集。通常情况下,用户会一次更换很多过滤器,从而引发许多AJAX请求。即使所有先前的请求都中止,jQuery AJAX请求也会变慢

所以我决定放弃以前的请求,如果有新的请求(通过使用ajax.abort()函数)。现在... Firebug将所有这些请求显示为中止,但最后一个请求(唯一没有中止的请求)在它之前中止的请求越来越长。

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

任何人都知道这是为什么?我猜,即使jQuery中止请求,我的服务器仍然处理它? (我正在开发模式下运行本地Rails Mongrel,fyi)这有点击败了我中止请求的全部原因......我能做些什么来解决这个问题?

非常感谢帮助!

+0

你确定服务器还没有处理那些先前的请求,并且它正在陷入困境? – 2010-08-15 00:51:41

+0

正如Nick Craver所暗示的,取消AJAX请求只会破坏回调处理程序 - 您的页面将忽略任何传入的信息。但是,只要您发送AJAX请求,请求就已经发送到服务器进行处理。但是,除非您的服务器流量非常大或速度很慢,否则这不太可能是问题所在。 – 2010-08-15 01:07:48

+0

嗯,所以我把它推到我的生产服务器上,它的工作原理很好 - 即它不是问题,因为服务器的响应速度比我能点击过滤器的速度快。就像你说的那样,只有慢速本地开发服务器的问题。仍然,似乎应该有一个更好的方式来做到这一点(为什么我们的服务器需要处理未使用的请求?)也许我会尝试安迪的答案延迟请求... – 2010-08-15 09:43:45

回答

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("https://stackoverflow.com/users/login_validate", $(login).serialize(), function(data) { 
      $("#loading_small").removeClass("loading-small"); 
      $("#login_valid").fadeIn().html(data); 
     }); 
     }, 500); 
    } 
    }); 
+0

听起来像一个很好的解决方案。在我看来更多的是黑客,但我觉得应该有办法告诉服务器停止处理这些请求......但我猜测没有。一堆无用的请求肯定会导致扩展问题? – 2010-08-15 09:47:50

+0

我不确定我会把它称为黑客 - 它基本上是“等待用户在发出请求之前停止键入半秒钟(或者您喜欢的长度)”。我更喜欢这样向服务器发送更多请求,告诉它取消旧请求。 – 2010-08-15 16:31:02