Javascript 当以前的尝试失败时,Firefox未完成一系列调用
我有一个脚本,它使用GET方法ping一系列URL。我只想每次ping它们一次,不希望得到响应。我的脚本可以在Chrome和Safari中运行,但Firefox无法完成后面的请求 有没有一种方法可以触发Firefox每次进行一系列调用(准确地说是五次),而不管它们是否失败?当第一个请求失败时,Firefox似乎无法完成这一系列请求 我正在使用javascript和jQuery,并加入了一些jQuery.ajax()。我已经搜索过了,但没有结果,已经达到了我初学者技能的极限。如有任何见解,将不胜感激 (如果您对整个范围感兴趣,请访问代码) 多谢各位Javascript 当以前的尝试失败时,Firefox未完成一系列调用,javascript,jquery,firefox,Javascript,Jquery,Firefox,我有一个脚本,它使用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
延迟它们不会停止预取程序尝试并缓存它们的响应以供以后使用