Javascript 当以前的尝试失败时,Firefox未完成一系列调用

Javascript 当以前的尝试失败时,Firefox未完成一系列调用,javascript,jquery,firefox,Javascript,Jquery,Firefox,我有一个脚本,它使用GET方法ping一系列URL。我只想每次ping它们一次,不希望得到响应。我的脚本可以在Chrome和Safari中运行,但Firefox无法完成后面的请求 有没有一种方法可以触发Firefox每次进行一系列调用(准确地说是五次),而不管它们是否失败?当第一个请求失败时,Firefox似乎无法完成这一系列请求 我正在使用javascript和jQuery,并加入了一些jQuery.ajax()。我已经搜索过了,但没有结果,已经达到了我初学者技能的极限。如有任何见解,将不胜感

我有一个脚本,它使用GET方法ping一系列URL。我只想每次ping它们一次,不希望得到响应。我的脚本可以在Chrome和Safari中运行,但Firefox无法完成后面的请求

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

我正在使用javascript和jQuery,并加入了一些jQuery.ajax()。我已经搜索过了,但没有结果,已经达到了我初学者技能的极限。如有任何见解,将不胜感激

(如果您对整个范围感兴趣,请访问代码)

多谢各位


更新:


经过进一步研究,我认为问题在于Firefox没有真正异步地处理调用。在Chrome和Safari中,我有使用img调用、iframe url调用和ajax调用进行ping的代码版本,但在Firefox中,它们的行为并不像我所需要的那样

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

下面是一个使用简单jquery.ajax调用方法的脚本示例。它可以在Safari和Chrome中使用,但在Firefox中无法达到预期效果。虽然我的所有代码都在运行,并且我可以看到状态更新(通过jquery.append函数生成),但请求不会每次发送一次,而是按顺序发送到我的服务器

<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>

$(文档).ready(函数(){
$(“按钮”)。单击(函数(){
$(“#敲打”)。追加(“敲打…”

”; setTimeout(函数(){ $.ajax({url:'https://example.sample.com:1111'}); $(“#knocks”)。追加(knock1/5完成…

”; }, 500); setTimeout(函数(){ $.ajax({url:'https://example.sample.com:2222'}); $(“#knocks”)。追加(knock2/5完成…

”; }, 3500); setTimeout(函数(){ $.ajax({url:'https://example.sample.com:3333'}); $(“#knocks”)。追加(knock3/5完成…

”; }, 6500); setTimeout(函数(){ $.ajax({url:'https://example.sample.com:4444'}); $(“#knocks”)。追加(knock4/5完成…

”; }, 9500) setTimeout(函数(){ $.ajax({url:'https://example.sample.com:5555'}); $(“#knocks”)。追加(knock5/5完成…

”; }, 12000); setTimeout(函数(){ $(“#knocks”)。追加(敲打完成…
转到站点:

”; }, 13000); }); });
鉴于你的问题没有真正的答案,你可能想继续前进,我想我会给你一些建议作为起点

为了使函数调用真正按顺序(或同步、按顺序、分块等)执行,您必须确保在后续请求完成后发出所有后续函数调用(本例中为AJAX请求)(要么成功,要么失败,在这种情况下,您可能不希望继续下一个顺序调用并发出完全独立的响应)

您现在这样做的方式并不被认为是同步的,而是异步的、延迟的(或“在后台”超时)。当您希望AJAX调用在服务器端同步执行(阻塞)时,这可能会导致各种问题。从浏览器重新发出失败或超时的请求(出于各种原因,这取决于它们的功能集以及它们如何处理失败的请求、缓存等),以便在启用某些预取器时(或以它们在FF中调用的方式)先发制人地发出请求和缓存结果,然后在预取失败时再次发出。我相信这与您在Firefox中观察到的情况类似,可能是导致此意外行为的主要原因。由于您无法控制最终用户在其浏览器中启用或禁用哪些功能,或者他们在未来版本中实现了哪些新功能,因此您无法真正期待服务器调用通过使用
setTimeout
延迟他们的调用来执行异步,即使他们在其他浏览器中似乎正在这样做(可能是因为您的服务器响应速度足够快,使他们看起来像这样)

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

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

您可以看到,浏览器在发出多个并发请求时没有问题,并且通过
setTimout
延迟它们不会停止预取程序尝试并缓存它们的响应以供以后使用