1

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

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

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

编辑:

我正在使用一个简单的ajax方法

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

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

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

})
4

5 回答 5

5

如果您在完成之前调用的相同请求之前再次调用相同的请求,那么您想要中止先前的请求并继续执行新请求。

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; });
})
于 2013-03-07T11:39:05.800 回答
1

2)您可以使用它来设置 ajax 调用同步或异步:

$.ajaxSetup({async: false});

在此函数调用之后,以下 ajax 调用($.ajax、$.post、$.get)会同步运行。而且我认为您可以在 post 中使用 async 参数并像在 ajax 方法中一样使用 get 方法。(但不确定)

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

于 2013-03-07T11:34:40.570 回答
0

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

于 2013-03-07T11:33:42.317 回答
0

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

在您的情况下,您可以考虑在每个 ajax 请求中包含增加的请求代码并在 jQuery 中跟踪它。收到响应后,您可以将其与当前请求代码进行比较,以确定结果是针对最新查询还是针对先前查询。虽然收到的最新响应低于发送的最新查询,但您可以直观地提示某些操作处于待处理状态,或者包含所有结果。当然,我们需要一些额外的信息来确保这在您的情况下是可能的。

不确定我是否理解你的第二个问题——上面的 Kovge 可能已经回答了这个问题。

于 2013-03-07T11:38:42.360 回答
0

幸运的是,jqXHR 对象支持abort()底层 XMLHttpRequest 对象的方法,允许中止未解析/未拒绝的 ajax 请求。

这可以通过保留对前一个返回的 jqXHR 对象的引用来完成$.get()

var blurPromise;

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

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

没有必要取消 blurPromise。调用abort()已解析的 jqXHR 将被忽略。

于 2013-03-07T11:49:36.590 回答