Javascript 如何中止$.post请求
我在keydown上有此事件: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(); $
$.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秒后结果出现。你可以深入研究断点,但这是一个混乱的代码。这并没有回答最初的问题,即,如何中止请求?正确,但这是一个更好的解决方案,他正在尝试做什么。中止请求是一种常见的思考方式,但它效率极低,不应该这样做。