确保ajax输出是最新的

时间:2012-09-26 08:29:45

标签: jquery post

我有一个Ajax jquery函数($ .post)来检索json数据。其执行方式之一是keydown($('#lkj')。keyup(函数(事件))延迟250毫秒。然而,一个问题是检索到的数据并不总是最新的。特别是当用户对服务器的ping很高。当我输入“test”时,jquery .post脚本会在两到四次之间执行(取决于我的打字速度):

  1. TES
  2. 测试
  3. 有时包含“te”的实例很慢并且最后是完整的,因此会覆盖由包含“test”的实例写入的输出。我该如何预防?

3 个答案:

答案 0 :(得分:1)

一种技术是在您的请求中使用序列号,并仅在与最新请求序列号匹配时处理输出。

例如:

var reqSeq = 0;

拨打$ .post电话时:

reqSeq++;
$.post('yourserver.com/yoururl?data=X&seq='+reqSeq, function(data) {

    // convert from JSON etc..

    // check if this response is for the latest request, if not, ignore response.
    if(data.seqNum < reqSeq) return;

    // process the response

});

答案 1 :(得分:0)

你需要限制事件,而不仅仅是延迟。

现在发生了什么:你快速输入“测试”。 4个keyup事件背靠背闪回,250ms后你得到4个ajax请求,每个事件一个。

您想要发生什么:您快速输入“测试”。如果在第一个键盘事件后250ms内收到另一个键盘事件,那么您想要取消第一个事件并重置计时器,每次在250ms内获得一个键盘时再次执行此操作。这最终只是1 ajax请求。

你可以手动实现,或者有插件可以处理它,这个:

http://benalman.com/projects/jquery-throttle-debounce-plugin/

答案 2 :(得分:0)

Yoy可以添加用于制作结果的响应消息“text”。并检查此文本(播放角色 - 标志)与当前日期的兼容性,如果当前值已更改,则不应将结果置于int字段中。

我认为如果你设置标志意味着现在是否执行ajax请求会更好。这有助于避免用户快速更改文本和服务器获得大量最新请求时的情况。