当先前的尝试失败时,Firefox无法完成一系列调用

Firefox not completing series of calls when previous attempts failed

本文关键字:Firefox 调用 一系列 失败      更新时间:2023-09-26

我有一个脚本,使用GET方法ping一系列url。我只想ping他们每个人一次,不期望一个回应。我的脚本可以在Chrome和Safari中工作,但是Firefox不能完成后面的请求。

是否有一种方法可以触发Firefox进行一系列调用(准确地说是五个),每次调用一次,并且不关心它们是否失败?当第一个请求失败时,Firefox似乎不会完成这一系列的请求。

我在javascript和jQuery工作,有一点jQuery.ajax()抛出。我已经搜索过了,但毫无用处,我已经达到了初学者的技能极限。如有任何见地,不胜感激。

(如果您对完整的范围感兴趣,可以在基于jquery的独立端口敲门器中找到代码)

谢谢。


更新:

经过进一步的研究,我认为问题在于Firefox并没有真正异步地处理调用。我有版本的代码使ping与img调用,iframe url调用和ajax调用工作在Chrome和Safari,但在Firefox中,他们不表现,因为我需要他们。

我们对敲打序列的服务器监控应该看到请求依次到达端口1,2,3,4,5(就像使用Chrome或Safari时一样),但在Firefox中,无论我尝试哪种方法,我都看到第一次尝试ping端口1两次,然后是端口2,在随后的尝试中,我只看到它ping端口1。我的状态更新如预期的那样出现,但是服务器没有按照需要的顺序接收调用。Firefox似乎正在重新尝试失败的调用,而不是依次执行每个调用一次,这正是我需要它做的。

下面是我的脚本使用一个简单的jquery的例子。Ajax调用方法。它可以在Safari和Chrome中工作,但在Firefox中无法达到预期的结果。当我所有的代码运行时,我可以看到状态更新(用jquery生成)。附加函数),请求不会按顺序发送一次到我的服务器。

<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('button').click(function(){
    $('#knocks').append('<p>Knocking...</p>');
    setTimeout(function(){
        $.ajax({url: 'https://example.sample.com:1111'});
        $('#knocks').append("<p>Knock 1 of 5 complete...</p>");
        }, 500);    
    setTimeout(function(){
        $.ajax({url: 'https://example.sample.com:2222'});
        $('#knocks').append("<p>Knock 2 of 5 complete...</p>");
        }, 3500);
    setTimeout(function(){
        $.ajax({url: 'https://example.sample.com:3333'});
        $('#knocks').append("<p>Knock 3 of 5 complete...</p>");
        }, 6500);
    setTimeout(function(){
        $.ajax({url: 'https://example.sample.com:4444'});
        $('#knocks').append("<p>Knock 4 of 5 complete...</p>");
        }, 9500)
    setTimeout(function(){
        $.ajax({url: 'https://example.sample.com:5555'});
        $('#knocks').append("<p>Knock 5 of 5 complete...</p>");
        }, 12000);
    setTimeout(function(){
        $('#knocks').append("<p>Knocking is complete... <br>Proceed to site: <a href='http://example-url.sample-url.com'>http://example-url.sample-url.com</a></p>");
        }, 13000);
});
});
</script>

看到你的问题没有真正的答案,你可能想继续前进,我想我应该给你一些建议作为起点。

要使您的函数调用真正按顺序执行(或同步按顺序阻塞,…),您必须确保在处理的请求完成后发出所有后续的函数调用(在您的情况下是AJAX请求)(无论是成功还是失败,在这种情况下,您可能不想继续下一个按顺序调用并发出一个完全独立的响应)。

你现在做的方式不被认为是同步,相反,它实际上是异步的,延迟的(或'在后台'超时)。当您期望AJAX调用在服务器端同步执行(阻塞)时,这可能会导致各种问题。从浏览器重新发出失败或超时的请求(由于各种原因,取决于他们的特性集和他们如何处理失败的请求,缓存,…)到在启用一些预取器(或者他们在FF中调用它)时先发制人地发出请求并缓存结果,然后在预取器失败时再次重新发出请求。我相信这与您在Firefox中观察到的情况类似,并且可能是导致这种意外行为的罪魁祸首。因为你不能控制终端用户在他们的浏览器中启用或禁用什么功能,或者他们在未来的版本中实现什么新功能,你不能指望你的服务器调用通过延迟对setTimeout的调用来异步执行,即使它们在其他浏览器中看起来是这样做的(可能是因为你的服务器响应速度足够快,以至于它们看起来像这样)。

在您的代码中,第二个调用似乎只同步执行(等待第一个调用完成)最多半秒,第三个请求最多3秒半,以此类推。但是,即使setTimeout阻塞执行(它没有),它将等待哪个外部请求?第一个还是第二个?我想你明白我想说的,以及为什么你的代码不能像预期的那样工作。

相反,您应该通过服务器的响应发出后续AJAX调用(这实际上是使用AJAX的关键,否则就不需要它),或者最好创建一个外部侦听器函数,该函数将根据之前外部调用的状态和/或返回值处理这些调用。如果您还需要处理失败的请求并继续执行,那么外部侦听器(具有预设的执行堆栈超时)是一种选择,因为您显然无法依赖于失败请求的响应。

你看,浏览器发出多个并发请求没有问题,用setTimout延迟它们也不会阻止预取器尝试缓存它们的响应以供以后使用。它也不会以阻塞的方式发出请求,下一个请求等待前一个请求完成,这是您所期望的。大多数人都很乐意利用一定数量的并发连接(在客户端机器上大约10个,在服务器上更多)来加快下载和/或页面呈现过程,而且出于同样的原因,有些人显然有更先进的缓存机制,Firefox只是其中之一。

我希望这澄清了一些事情,你将能够重写你的代码,如预期的工作。由于我们不知道服务器端代码应该如何工作,所以您必须自己编写。然而,在SE上有很多讨论类似技术的线程,你可能决定使用,如果你遇到困难,你可以随时问另一个问题,我们很乐意帮助你。

干杯!