繁体   English   中英

Ajax请求和竞争条件(客户端和服务器端)

[英]Ajax requests and racing conditions (client and server side)

让我们想象一下这种情况,我们已经向服务器一个接一个地发送了两个相似(几乎相似)的异步ajax请求。 由于网络滞后,第二个请求在第一个请求之前执行。

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

结果,我们将object_id=1 position设置为position=5 ,但是我们希望position=6因为Ajax request #2是在我们执行Ajax request #1之后执行的。

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

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

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

我不确定如何处理时钟不同步的多个客户端...

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

例如:

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

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

我不知道您的用例的细节,但是这种通用模式应该会有所帮助。

在服务器上:

  • 建立一个请求表以将请求ID映射到时间戳
  • 将任何请求记录到服务器,期望所有请求都带有时间戳
  • 如果有任何请求出故障(例如,位置6在5之前)
    • 检查请求表,如果它是较早的请求(时间戳),则不处理该请求并发送忽略标志
  • 如果有序
    • 很好,可以照常进行,不需要发送任何忽略命令

在客户端上:

  • 当请求返回时,检查ignore标志。 如果有的话。 不要对客户做任何事
  • 否则照常处理数据

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM