[英]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
}
});
我不知道您的用例的细节,但是这种通用模式应该会有所帮助。
在服务器上:
在客户端上:
请注意,我建议的此实现要求您来回发送数据(例如JSON),而不是表示代码(例如HTML片段),因为您需要在客户端检查是否忽略标志。
这个答案类似于@Farray使用时间戳的建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.