0

我有一个检索 json 数据的 Ajax jquery 函数 ($.post)。它的执行方式之一是通过 keydown ($('#lkj').keyup(function(event)) 延迟 250 毫秒。然而,一个问题是检索到的数据并不总是最新的。尤其是当用户对服务器的 ping 很高。例如,当我输入“test”时,jquery .post 脚本将(取决于我的输入速度)执行两到四次:

  1. 测试
  2. 测试

有时包含“te”的实例很慢并且是最后一个完整的,因此会覆盖包含“test”的实例写入的输出。我该如何防止呢?

4

3 回答 3

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

});
于 2012-09-26T08:34:25.750 回答
0

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

现在发生了什么:你快速输入“test”。4 个 keyup 事件背靠背触发,250 毫秒后您收到 4 个 ajax 请求,每个事件一个。

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

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

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

于 2012-09-26T08:36:54.283 回答
0

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

我认为如果您设置标志,这意味着是否现在执行 ajax 请求,那会很好。这有助于避免用户快速更改文本而服务器收到大量更新请求的情况。

于 2012-09-26T08:43:26.643 回答