Javascript Ajax请求和竞速条件(客户端和服务器端)
让我们想象一下这样的情况:我们已经向服务器逐个发送了两个相似(几乎相似)的异步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 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之前)
- 检查请求表,如果是较早的请求(时间戳),则不处理该请求并发送忽略标志
- 如果一切正常的话
- 这很好,照常进行,无需发送任何忽略订单
- 当请求返回时,检查忽略标志。如果有。不要对客户做任何事
- 否则,按常规处理数据