【问题标题】:How to deal with out-of-sequence Ajax requests?如何处理乱序的 Ajax 请求?
【发布时间】:2010-12-04 18:04:19
【问题描述】:

处理乱序 Ajax 请求的最佳方法是什么(最好使用 jQuery)?

例如,每当字段更改时,用户的浏览器都会发送 Ajax 请求。用户可能将dog_name 更改为“Fluffy”,但片刻之后,她将其更改为“Spot”。第一个请求由于某种原因被延迟,所以它在第二个之后到达服务器,她的狗最终被称为“Fluffy”而不是“Spot”。

我可以将客户端时间戳与每个请求一起传递,并让服务器将其作为每个 Dog 记录的一部分进行跟踪,并忽略先前更改同一字段的请求(但前提是差异小于超过 5 分钟,以防用户更改她机器上的时间)。

这种方法是否足够稳健,还是有更好、更标准化的方法?

编辑:

马特在他的评论中提出了一个很好的观点。将请求序列化以更改相同的字段要好得多,那么有没有标准的方式来实现 Ajax 请求队列?

编辑#2

针对@cherouvim 的评论,我认为我不必锁定表单。字段更改以反映用户的更改,将更改请求放入队列中。如果更改同一字段的请求正在队列中等待,请删除该旧请求。我仍然需要解决两件事:

  1. 将请求放入队列是一项异步任务。我可以让前一个 Ajax 请求的回调处理程序发送队列中的下一个请求。 Javascript 代码不是多线程的(或者……是吗?)

  2. 如果请求失败,我需要用户界面来反映上次成功请求的状态。因此,如果用户将狗的名字更改为“Spot”并且 Ajax 请求失败,则必须将该字段设置回“Fluffy”(最后一个成功提交的值)。

我遗漏了哪些问题?

【问题讨论】:

  • 更简单:不允许多个同时请求同一字段。如果更改发生得如此之快,请将它们排队。
  • @Matt Ball:你如何“锁定”客户的整个 display-form-push-changes 对话?这不是一个请求/响应周期,而是两个。

标签: ajax http jquery asynchronous


【解决方案1】:

首先,您需要为每个客户端序列化服务器端处理。如果您使用 Java 编程,那么在 http 会话对象上同步执行就足够了。如果在处理第一个更新时出现第二个更新,则序列化将有所帮助。

您可以在实体更新中实施的第二个增强功能是http://en.wikipedia.org/wiki/Optimistic_concurrency_control。您为您的实体添加 version 属性(和列)。每次发生更新时,它都会增加一次。实际上更新语句看起来像:

update ... set version=6 ... where id=? and version=5;

如果上述伪查询查询中受影响的行为 0,则其他人已设法首先更新实体。那你怎么做就看你自己了。请注意,您需要将实体的 html 更新表单上的版本呈现为隐藏参数,并在每次更新时将其发送回服务器。返回时您必须写回更新的版本。

一般来说,第一次增强就足够了。第二个将改进系统,以防多人同时编辑相同的实体。它解决了“丢失更新”的问题。

【讨论】:

  • 版本控制是一个好点,但在这种情况下,我不担心用户会用过时的数据破坏彼此的更新。就我而言,一系列小更新来自同一用户快速连续。
  • 版本控制适用于每个更新,即使来自同一用户。每个 ajax 字段更新都是一个版本增量。因此,您的“现场”更改会将版本从 5 增加到 6,并且您的陈旧“蓬松”将被检测为陈旧更新(因为它也会发送版本 5)并且您可以做任何您想做的事情,例如忽略它。
【解决方案2】:

我会在客户端实现一个队列,其中包含成功请求的链接或不成功请求的回滚。

您需要定义“不成功”,无论是超时还是返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2013-01-31
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    相关资源
    最近更新 更多