当先前的尝试失败时,Firefox无法完成一系列调用
Firefox not completing series of calls when previous attempts failed
我有一个脚本,使用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
的调用来异步执行,即使它们在其他浏览器中看起来是这样做的(可能是因为你的服务器响应速度足够快,以至于它们看起来像这样)。
setTimeout
阻塞执行(它没有),它将等待哪个外部请求?第一个还是第二个?我想你明白我想说的,以及为什么你的代码不能像预期的那样工作。
相反,您应该通过服务器的响应发出后续AJAX调用(这实际上是使用AJAX的关键,否则就不需要它),或者最好创建一个外部侦听器函数,该函数将根据之前外部调用的状态和/或返回值处理这些调用。如果您还需要处理失败的请求并继续执行,那么外部侦听器(具有预设的执行堆栈超时)是一种选择,因为您显然无法依赖于失败请求的响应。
你看,浏览器发出多个并发请求没有问题,用setTimout
延迟它们也不会阻止预取器尝试缓存它们的响应以供以后使用。它也不会以阻塞的方式发出请求,下一个请求等待前一个请求完成,这是您所期望的。大多数人都很乐意利用一定数量的并发连接(在客户端机器上大约10个,在服务器上更多)来加快下载和/或页面呈现过程,而且出于同样的原因,有些人显然有更先进的缓存机制,Firefox只是其中之一。
我希望这澄清了一些事情,你将能够重写你的代码,如预期的工作。由于我们不知道服务器端代码应该如何工作,所以您必须自己编写。然而,在SE上有很多讨论类似技术的线程,你可能决定使用,如果你遇到困难,你可以随时问另一个问题,我们很乐意帮助你。
干杯!
- Ajax调用在Firefox中不会自动响应
- Ajax调用在InternetExplorer中冻结UI,但在firefox中运行良好
- 我们如何在Firefox中调用AJAX
- Firefox在调用函数(jquery)时冻结
- 在firefox中,使用jquery ajax不会调用错误和完整回调
- 由于传输层/meta/connect调用,使用faye/nodejs在Firefox / chrome上的初始页面加载时
- FireFox webrtc createoffer,没有任何回调调用
- Jquery没有在firefox浏览器中调用Webservice方法,它在Chrome和IE中运行良好
- 回溯历史后,Firefox中的Ajax调用缓存
- Firefox弹出窗口“;这个网页被重定向到一个新的位置“;在每个requestPromise ajax调用上,有什么方
- firefox扩展对$.ajax的调用不起作用
- Firefox onLocationChange并不总是被调用
- 如何使用js ctypes Firefox扩展来调用本机C代码
- 在 Ajax 调用中 Firefox 中的弹出窗口阻止程序问题已成功
- XrayWrapper 错误(值是可调用的)在 Firefox 插件中覆盖原型方法时
- jQuery AJAX 调用在 Firefox 中有效,但在 IE 中不起作用 - 返回有效响应
- HTML5 视频的 canplay/canplaythrough 事件不会在 Firefox 上调用.为什么
- RegExp.exec() 在 Firefox 中反复调用时返回 null
- 用Firefox调用嵌套iframe上的JS函数
- firefox调用window.open时出现问题