Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax请求和竞速条件(客户端和服务器端)_Javascript_Php_Ajax_Race Condition - Fatal编程技术网

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

Javascript Ajax请求和竞速条件(客户端和服务器端),javascript,php,ajax,race-condition,Javascript,Php,Ajax,Race Condition,让我们想象一下这样的情况:我们已经向服务器逐个发送了两个相似(几乎相似)的异步ajax请求。由于网络延迟,第二个请求在第一个请求之前执行 Ajax request #1: /change/?object_id=1&position=5 Ajax request #2: /change/?object_id=1&position=6 结果,我们将object_id=1position设置为position=5,但我们想要position=6,因为Ajax请求#2是在我们执行Aja

让我们想象一下这样的情况:我们已经向服务器逐个发送了两个相似(几乎相似)的异步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请求#2
是在我们执行
Ajax请求#1
之后执行的


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

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

例如:

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

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

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

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

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

我不确定如何处理服务器上时钟不同步的多个客户端…

  • 构建一个请求表,将请求id映射到时间戳
  • 将任何请求记录到服务器,所有请求都带有时间戳
  • 如果任何请求不符合顺序(例如,位置6在位置5之前)
    • 检查请求表,如果是较早的请求(时间戳),则不处理该请求并发送忽略标志
  • 如果一切正常的话
    • 这很好,照常进行,无需发送任何忽略订单
在客户机上:

  • 当请求返回时,检查忽略标志。如果有。不要对客户做任何事
  • 否则,按常规处理数据
请注意,我建议的这个实现需要来回发送数据(如JSON),而不是表示代码(如HTML片段),因为您需要在客户端检查ignore标志

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