2013-03-07 43 views
1

我有一个很大的表单,其中更改任何值应该触发对服务器的ajax调用,执行一些计算并返回结果。但问题是,用户不会等待每个ajax调用完成,并且在几次这样的调用堆积之后,我得到的最后结果可能不是最近一次调用服务器的结果,因为每个调用的响应时间ajax呼叫可能并将根据数据和其他因素而有所不同。但是我需要确保向用户展示与最近更改相对应的数据。所以,我需要确保使用jquery get或post的最新响应

1)有没有办法避免这种情况,而使用$ .get()或$ .post()?

2)在上述两种方法中有没有办法使用同步/异步?或者我必须使用$ .ajax()?

编辑:

我用一个简单的Ajax方法

$("#someField").blur(function(e){ 

    $.get("someURL.php?v="+$(this).val(),function(d){ 

     $("#result").html(d); 
    }); 

}) 
+0

你能提供你已经使用的代码片段吗?使用.get或.post回调函数可以让您在收到返回结果时调用其他函数。 – John 2013-03-07 11:28:47

+0

我修改了我的帖子,看到上面的 – Bluemagica 2013-03-07 11:32:09

+0

我认为你需要使用递归回调 - 让它自己调用,但只要它完成了,不管它在后端做什么 – 2013-03-07 11:32:48

回答

5

如果您在完成先前调用的相同请求之前再次调用相同的请求,那么您希望中止prevoius请求并继续处理新的请求。

var xhr = null; 
$("#someField").blur(function(e){ 
    if(xhr)xhr.abort(); 
     xhr=$.get("someURL.php?v="+$(this).val(),function(d){ 
       $("#result").html(d); 
      }).done(function() { xhr = null; }); 
}) 
0

如果Ajax调用不进行数据的任何更改(只计算和阅读)。如果您在再次调用ajax之前中止任何以前的调用,那就没问题了。

+0

我如何检查并中止以前未完成的请求? – Bluemagica 2013-03-07 11:36:15

1

2)你可以利用这一点,来设定AJAX调用同步或异步:

$.ajaxSetup({async: false}); 

调用该函数后,下面的AJAX调用($阿贾克斯,.post的$,$不用彷徨)运行syncronous 。 我认为你可以在post中使用async参数,并像ajax方法那样获取方法。 (但不知道)

但我不推荐它。 Javascript应该用作异步语言。 你应该停止以前的电话。另一位评论者写道。

+0

确实没有。永远永远不会使用{async:false}。 – 2013-03-07 11:51:35

+0

@Kovge非常感谢您的帮助,但您是否也可以解释为什么我不应该使用同步模式?除了明显的可用性滞后之外,是否还有其他潜在问题? – Bluemagica 2013-03-07 12:28:22

+0

@aoi。如果您对async vs sync ajax调用感兴趣,本文可能会为您介入:http://javascript.about.com/od/ajax/a/ajaxasyn.htm – Kovge 2013-03-07 19:10:24

0

jQuery自动完成插件(http://www.devbridge.com/projects/autocomplete/jquery/)使用的一种方法是将查询包含在响应中,以确保显示的结果适用于正确的查询。

就你而言,你可以考虑在每个Ajax请求中包含一个递增的请求代码,并在jQuery中跟踪它。收到回复后,您可以将其与当前请求代码进行比较,以确定结果是针对最新查询还是针对之前的查询。尽管收到的最新响应低于最新发送的查询,但您可以提供一些视觉提示,指出某些操作正在处理中,或者包含所有结果。当然,我们需要一些额外的信息来确保在你的情况下这是可能的。

不知道我是否理解你的第二个问题 - 上面的Kovge可能已经回答了。

0

幸运的是,jqXHR对象支持底层XMLHttpRequest对象的abort()方法,允许悬而未决/ unrejected AJAX请求被中止。

这可以通过保持对前面的$.get()返回的jqXHR对象的引用来完成。

var blurPromise; 

$("#someField").blur(function(e) { 
    if(blurPromise) blurPromise.abort(); 
    blurPromise = $.get("someURL.php?v="+$(this).val(), function(d) { 
     $("#result").html(d); 
    }); 
}); 

当blurPromise未定义时,if(blurPromise)测试用于处理初始条件。

有没有必要清空blurPromise。在已解析的jqXHR上调用abort()将被忽略。