如何处理无序的Ajax请求?

时间:2010-12-04 18:04:19

标签: ajax http jquery asynchronous

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

例如,只要字段发生变化,就会从用户的浏览器发送Ajax请求。用户可以将dog_name更改为“蓬松”,但过了一会儿,她将其更改为“Spot”。第一个请求因任何原因而被延迟,因此它在第二个请求后到达服务器,并且她的狗最终被称为“Fluffy”而不是“Spot”。

我可以传递客户端时间戳以及每个请求,并让服务器将其作为每个Dog记录的一部分进行跟踪,并忽略之前更改相同字段的请求(但仅在存在差异时)如果用户在她的机器上更改时间,则少于5分钟。

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

修改

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

编辑#2

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

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

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

  3. 我错过了哪些问题?

2 个答案:

答案 0 :(得分:3)

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

您可以在实体更新中实施的第二项增强功能是http://en.wikipedia.org/wiki/Optimistic_concurrency_control。您为实体添加version属性(和列)。每次更新发生时,这都会增加一次。实际上,update语句如下所示:

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

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

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

答案 1 :(得分:1)

我会在客户端实现一个队列,链接成功的请求或对不成功的请求进行回滚。

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