2011-09-06 184 views
2

让我们想象一下,我们已经向服务器发送了两个类似(几乎相似)的异步ajax请求。由于网络滞后,第二次请求在第一次请求之前执行。Ajax请求和竞速条件(客户端和服务器端)

Ajax request #1: /change/?object_id=1&position=5 
Ajax request #2: /change/?object_id=1&position=6 

在结果中,我们有object_id=1位置设置为position=5,但我们希望position=6因为Ajax request #2Ajax request #1美国后执行。

在服务器端和客户端避免这种情况的最佳做法是什么?

回答

0

对于这样的情况,我通常在我的成功处理程序中进行检查,以确保返回的值仍然是我想要的值。这将需要发送你在结果对象中搜索的参数。

例如:

var query = $('input').val(); 

$.get('/search', { query: query }, function(res) { 
    if(res.query == $('input').val()) { 
    //show search results 
    } 
}); 

我不知道您的使用案例的细节,但是这一般模式应该有所帮助。

1

您是否担心来自同一客户或多个客户的赛车状况?

如果来自同一个客户端,我认为最安全的方法是在ajax请求中包含一个unix时间戳并将该值记录在服务器上。如果请求带有比上次记录的值更早的时间戳,请忽略该请求(或将警告发送回浏览器)。

我不知道你将如何处理多个客户端与不同步的时钟......

0

在服务器上:

  • 建立一个请求表映射请求ID为timestamp
  • 任何登录向服务器发送请求,期望所有请求都附带时间戳
  • 如果有任何请求出现故障(例如位置6在5之前)
    • 检查请求表,如果它是一个较早的请求(时间标记),那么不处理该请求并发送忽略标志
  • 如果谈到为了
    • ,这是好的,继续像往常一样,并没有需要发送任何忽略为了

在客户端:

  • 当请求回来的,检查忽略标志。如果它在那里。不要做任何的客户端
  • 否则继续像往常一样通过处理数据

注意,此实现,我建议需要你来回发送数据(如JSON),而不是演示代码(如HTML片段),因为您需要检查客户端的忽略标志。

这个答案类似于@Farray使用时间戳的建议。