如何处理无序的Ajax请求?

如何处理无序的Ajax请求?,ajax,http,jquery,asynchronous,Ajax,Http,Jquery,Asynchronous,处理无序Ajax请求的最佳方法是什么(最好使用jQuery) 例如,只要字段发生更改,就会从用户的浏览器发送Ajax请求。用户可以将dog\u name更改为“Fluffy”,但片刻后,她将其更改为“Spot”。第一个请求由于任何原因被延迟,因此它在第二个请求之后到达服务器,她的狗最终被称为“Fluffy”,而不是“Spot” 我可以将客户端时间戳与每个请求一起传递,让服务器跟踪它作为每个狗记录的一部分,并忽略先前更改同一字段的请求(但前提是差异小于5分钟,以防用户更改其机器上的时间) 这种方法

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

例如,只要字段发生更改,就会从用户的浏览器发送Ajax请求。用户可以将
dog\u name
更改为“Fluffy”,但片刻后,她将其更改为“Spot”。第一个请求由于任何原因被延迟,因此它在第二个请求之后到达服务器,她的狗最终被称为“Fluffy”,而不是“Spot”

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

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

编辑:

马特的评论很有道理。序列化请求以更改同一字段要好得多,那么是否有实现Ajax请求队列的标准方法

编辑#2

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

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

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


  • 我遗漏了什么问题

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

    可以在实体更新中实现的第二个增强是。为实体添加
    版本
    属性(和列)。每次更新都会增加一次。事实上,update语句如下所示:

    update ... set version=6 ... where id=? and version=5;
    
    如果上述伪查询中受影响的行为0,则其他人已设法首先更新实体。那么你该怎么做就取决于你了。请注意,您需要将实体的html更新表单上的版本作为隐藏参数呈现,并在每次更新时将其发送回服务器。返回时,您必须回写更新版本


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

    我将在客户端实现一个队列,链接成功请求或回滚失败请求


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

    更简单:不允许对同一字段同时发出多个请求。如果更改发生得如此之快,请将其排队。@Matt Ball:那么如何“锁定”整个显示表单推送客户端的更改会话?这不是一个单一的请求/响应周期,而是两个。版本控制是一个很好的观点,但在这种情况下,我并不担心用户用过时的数据互相攻击对方的更新。在我的例子中,一系列小的更新很快就从同一个用户开始了。版本控制适用于每个更新,甚至来自同一个用户。每个ajax字段更新都是一个版本增量。因此,您的“spot”更改将使版本从5增加到6,并且您的、陈旧的“fluffy”将被检测为陈旧更新(因为它也将发送版本5),您可以执行任何您想要的操作,例如忽略它。