后续的AJAX请求是否保证按顺序接收?

7
我有一个App,用户可以通过一个小的开关/按钮改变一个布尔值(true/false),更改会自动发送到服务器,无需用户显式地按下“保存”之类的按钮。现在,如果用户连续两次快速按下切换开关,是否可能导致服务器接收到乱序的数据包,最终存储了错误的值?这里我的意思是指运行在服务器上的应用逻辑,而非操作系统网络栈。我知道TCP数据包是编号的,所以接收方的操作系统会在把它们传递给应用程序之前对它们进行排序,而HTTP是在TCP之上运行的。但我好奇的部分是,HTTP在哪些情况下创建或不创建新的TCP连接。请注意,我使用jQuery发送AJAX请求,并假定它们保证按调用jQuery库的顺序发送。这个假设是否有效?
1个回答

5

在HTTP协议中没有这样的保证。即使某些实现可能确实保证了它,你也不应该依赖它。

你可以这样做:维护一个点击计数(或者称之为版本号),并将其发送到服务器。在服务器上,在改变状态时存储最后一个版本号,并使用此号码检查您是否曾经覆盖了更近期的值。


+1;对于这种版本控制,最简单的逻辑可能是(new Date).getTime() - David Hedlund
3
JavaScript 是单线程的,因此 jQuery 会按顺序发送请求,但无法保证请求何时到达服务器。实际上它们几乎总是能够到达,但不要编写任何依赖于这一点的逻辑。 - TJ VanToll
@DavidHedlund 注意:当时间发生变化(用户显式更改时间,时间服务器同步)时,此操作可能会失败。 - Samuel Rossille
1
你可以一直阻止 切换开关 直到从服务器接收到 AJAX 响应。在我看来,这是最好的方法。 - freakish
@TJVanToll 小心。在JavaScript中执行是单线程的,并且由于jQuery的实现,多个后续调用$.ajax将以相同的顺序在传输(例如XMLHttpRequest)上调用send。 此外,从个人经验来看,在的互联网连接情况下,顺序有相对较大的机会不同。即使这些调用相隔数十毫秒。但是,作为一名带有快速互联网连接的开发人员,这真的很难复制。 - Yeti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接