Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.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_Jquery_Ajax - Fatal编程技术网

Javascript 同步链接点击和异步AJAX请求期间的竞争条件?

Javascript 同步链接点击和异步AJAX请求期间的竞争条件?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我目前面临的情况与下面显示的相对简单的示例类似。当用户单击指向第三方域的链接时,我需要捕获用户DOM中存在的某些特征,并将这些数据存储在我的服务器上。我为所有支持JS的用户捕获这些数据,并且不丢失数据,这一点至关重要 我有点担心我当前的实现(如下所示)可能有问题。如果外部目标服务器非常快(或者我的内部/save outbound link data端点非常慢),并且用户访问外部链接的请求在内部AJAX请求有足够的时间完成之前被处理,会发生什么情况?我不认为这会是一个问题(因为在这种情况下,浏览器

我目前面临的情况与下面显示的相对简单的示例类似。当用户单击指向第三方域的链接时,我需要捕获用户DOM中存在的某些特征,并将这些数据存储在我的服务器上。我为所有支持JS的用户捕获这些数据,并且不丢失数据,这一点至关重要

我有点担心我当前的实现(如下所示)可能有问题。如果外部目标服务器非常快(或者我的内部
/save outbound link data
端点非常慢),并且用户访问外部链接的请求在内部AJAX请求有足够的时间完成之前被处理,会发生什么情况?我不认为这会是一个问题(因为在这种情况下,浏览器不关心从AJAX请求中接收响应),但是如果能得到其他开发人员的一些确认,我将不胜感激

此外,如果

请注意,在
$内使用
event.preventDefault()
,以及
window.location.href=var.attr('href')
。post
的成功回调,对我来说不是一个可行的解决方案。也不是将用户发送到我的服务器上的初步脚本(例如,/outbound?cat=programming&dest=),捕获他们的数据,然后重定向到他们的目标。

Edit 2

也考虑握手步骤():

建立连接所需的时间,包括TCP握手/重试和协商SSL

我认为,如果您的客户端不再开放连接到服务器(即,您已经在Stackoverflow或链接导航到的任何网站),那么您和您发送AJAX请求的服务器都无法完成握手

编辑1 但更广泛地说,我希望从理论上理解我所担心的风险是否合法

这是一个有趣的问题,答案可能不像看上去那么明显

这只是“我的网络”选项卡中的请求/响应示例。绝对不应该被认为是一般请求/响应的任何趋势或表示

我认为我们可能最关心的差距是1.933ms的失速时间。在发送实际请求之前,还需要执行其他步骤(其本身约为0.061ms)

我会担心在实际请求之前的3个步骤中是否有任何一个出现中断(大约需要35毫秒的“给予或接受”)

我想问题是,如果你在“暂停”、“DNS查找”和“初始连接”步骤发生之前去了其他地方,请求还会被发送吗?那部分,我不知道。但是一般的电脑或浏览器怎么办呢

正如您所提到的,从Stackoverflow到Stackoverflow的req/res周期比您的客户机上发生的更快(即,对服务器的网络请求的启动本身,甚至不是整个周期)的想法可能有点荒谬,但我认为理论上(如您所提到的,这是您感兴趣的),一般来说,依靠这些类型的比赛条件可能不是一个好主意

原始答案 让AJAX请求同步怎么样

$.ajax({
    type: "POST",
    url: url,
    async: false
});
<>这通常是一个可怕的想法,但是,如果在你的情况下,遗留代码是如此的限制,你没有办法修改它,这是你最后的选择(思考,僵尸启示录),然后考虑它。 看


这是个坏主意的原因是它完全阻塞(在正常情况下,您不希望潜在的不可完成请求阻塞主线程)。但在你的情况下,看起来这正是你想要的。

为什么你在文章末尾概述的两种方法不可行?我觉得这两种方法中的第一种是这里的标准方法。谢谢你的回答,@brendan。我在这里发布的示例代码非常做作。实际上,我是在更复杂的遗留代码的限制下工作的,这些代码不能被修改以利用这些替代方法中的任何一种。@NateB,遗留代码具体有哪些限制?很难想象,它对您的限制如此之大,以至于您无法阻止链接到任何地方,而只是在回调中重定向。另外,为什么不能修改遗留代码?你是对的,在位置改变之前,依靠
帖子
来完成是个坏主意。有点像竞争条件类型的场景。@JoshBeam,你说得对——遗留代码在技术上是可以更新的。但更广泛地说,我希望从理论上理解我所担心的风险是否合法。我知道替代方法是首选方法,但为了便于讨论(以及其他可能真正处于类似位置的人),让我们假设它们不在讨论范围内。谢谢,Josh。我回复了你上面的评论。总的来说,我希望更好地理解代码示例中可能存在的潜在竞争条件,而不是寻求一个解决方案来完全消除这个问题。@NateB,一个完全合理的问题。我很想亲自去了解更多。我更新了我的答案,希望它能提供一些额外的信息。
$.ajax({
    type: "POST",
    url: url,
    async: false
});