Javascript 如何中止$.post请求

Javascript 如何中止$.post请求,javascript,jquery,ajax,Javascript,Jquery,Ajax,我在keydown上有此事件: $.post("search.php", { s: $('#box_s').val()}, function(data) { /**/ } }); 问题在于,尽可能多的键控请求以及有时较旧的请求会覆盖最近的请求结果 所以我需要 $('input#box_s').keydown(function(){ abort_previous_post(); $

我在keydown上有此事件:

$.post("search.php", { s: $('#box_s').val()},
               function(data) {
                  /**/
               }
});
问题在于,尽可能多的键控请求以及有时较旧的请求会覆盖最近的请求结果

所以我需要

$('input#box_s').keydown(function(){
     abort_previous_post();
     $.post("search.php", { s: $('#box_s').val()},
                   function(data) {
                      /**/
                   }
    });
});

有可能吗?

我会这样做:

var requestCount = 0;

$('input#box_s').keydown(function(){
     requestCount++;
     var thisRequestCount = requestCount;
     $.post("search.php", { ingredientes_s: $('#box_s').val()},
                   function(data) {
                      if(thisRequestCount!=requestCount) return;
                      /**/
                   }
    });
});

您可以对其进行限制,以便在用户停止键入x毫秒之前不会发出请求。250-400ms似乎是一个很好的值:

function throttle( fn, time ) {
    var timer = 0;

    return function() {
        window.clearTimeout( timer );
        var self = this,
            args = [].slice.call( arguments );


        timer = setTimeout( function() {
            return fn.apply( self, args );
        }, time );
    };

}
使用方法:

$('input#box_s').keydown( throttle( function(){

     $.post("search.php", { s: $('#box_s').val()},
                   function(data) {
                      /**/
                   }
    });
}, 400 ) );

在这种情况下,请求是在用户开始键入后发出的,然后停止400毫秒。

您要做的是不启动请求,除非有轻微延迟:

var timeoutID;
$('#box_s').keydown(function () {
    clearTimeout(timeoutID);
    timeoutID = setTimeout(function () {
        $.post("search.php", { ingredientes_s: $('#box_s').val()}, function(data) {
            /** **/
        });
     }, 500);
});

检查演示。

post调用只是Ajax处理程序的一种说服方法,因此捕获xhr并中止它

var jqxhr;

$('input#box_s').keydown(function(){
     if (jqxhr) jqxhr.abort();
     $.post("search.php", { ingredientes_s: $('#box_s').val()},
                   function(data) {
                      /**/
                   }
    });
});

与此类似:这会向服务器发出大量不必要的请求。用户越多或数据集越大,这真的是一个不可接受的解决方案。@alecgorge google live search没有任何超时,而且他们有很多用户。他们很好;)提交请求并不意味着高带宽。如果不限制一个简单的查询,它可能每秒额外花费400字节。更复杂的问题,很可能会有问题。。但这个问题意味着输入的内容正在被发送。谷歌已经花费了大量的时间、金钱和精力来让搜索结果尽快进入。对于大多数开发人员来说,我们讨论的是针对MySQL数据库的全文或类似查询。最大限度地减少对服务器、PHP和MySQL的点击是一个明智的想法——特别是当最终结果非常相似时。@alecgorge我没有说这更好,而是“这真的成为了一个不可接受的解决方案”。如果客户端在400毫秒内没有收到响应怎么办?它将覆盖最新版本。@meze它取决于用例,自动建议是非常无用的,例如,如果它需要超过400毫秒。谷歌有100毫秒的自动提示和1000毫秒的即时提示。很好的通用节流实现!您可能会有另一个特定于回迁的回迁(例如throttleFetch),该回迁还可以处理上一次回迁的取消或无效。@Esailija您如何知道即时回迁的1000毫秒?我键入一个4个字母的单词,它在一行中执行4个查询。@meze我看到用1000作为时间参数调用的
setTimeout
,大约1秒后结果出现。你可以深入研究断点,但这是一个混乱的代码。这并没有回答最初的问题,即,如何中止请求?正确,但这是一个更好的解决方案,他正在尝试做什么。中止请求是一种常见的思考方式,但它效率极低,不应该这样做。