我有一个非常简单的小过程。我有一个间隔计时器,当它到期时,它将对服务器进行ajax调用。使用返回的json,它解析出并更新DOM。 setInterval设置为一秒。然后,服务器对数据库执行非常简单的SELECT。如果执行查询,它将执行一个毫秒的查询。
在我们的测试服务器上,它工作正常。但是,当将其部署到我们的客户时,大多数情况下实际上并没有访问数据库。我们可以在查询分析器中看到它。查询应该是连续不断的,但是充其量是零散的,每次命中之间通常间隔40秒或更长时间。
这是代码:
setTimeout(function run() {
// When the timer elapses, get the data from the server
GetData(0);
setTimeout(run, _refreshRate);
}, 1000);
function GetData(isFirstLoad) {
//console.log("Attempting to obtain the data...");
jQuery.ajax({
url:"something.ashx",
type:"GET",
contentType: 'application/json; charset=utf-8',
success: function(resultData) {
//console.log("Got the data.");
ParseJson(resultData);
// show the last refresh date and time
$('#refreshTime').html(GetDateTime());
},
error : function(xhr, textStatus, errorThrown) {
if (textStatus == 'timeout') {
//console.log("Timeout occured while getting data from the server. Trying again.");
// If a timeout happens, DON'T STOP. Just keep going forever.
$.ajax(this);
return;
}
},
timeout: 0,
});
}
ParseJson(resultData);中的所有内容都可以正常工作。有了这条线...
$('#refreshTime').html(GetDateTime());
...时间每秒钟刷新一次,就像发条一样,即使数据库永远不会受到影响。
而且我可以在error内的调试工具中放置一个断点,而这个断点永远不会被击中。
如果我们单击刷新,它会起作用或等待几秒钟(我们可以看到查询命中了数据库),但随后又变慢了。
令人沮丧的是,它可以在我们的测试服务器上完美运行。但是显然有一些我忽略的事情。
编辑:
好的,这真的很奇怪。当我打开调试器时,它可以工作。关闭调试器后,它将立即停止工作。我什至不必让网络标签运行并捕获事件。只需打开调试器窗口即可使其工作。
这就是IE,客户端正在使用它,因此这是我们唯一的选择。
什么是$.ajax(this);?错误回调被调用了吗?顺便说一句,如果整个事情在另一个部署中都还不错,那么您很难指望这是一个编程问题...
我发现在这里的另一个线程上,试图弄清楚如何进行ajax调用时,只要有超时就可以简单地再次执行自身操作。
话虽如此,我可以在我的测试服务器和客户端生产服务器上都设置一个断点,而这个断点永远不会受到攻击。一旦设置了timeout:0,它就再也不会超时...我认为这很好。
从来没有听说过,我对此表示高度怀疑。 this的设置取决于JS上下文,因此该行可能导致错误或意外行为。
如果请求成功,则后端或分析仪中有问题。做一些服务器端日志
@marekful,好的,我对此表示感谢。有什么建议吗?
AJAX通话的网络响应是什么?您可以在网络标签中签入chrome的开发者工具。我敢打赌,您会得到回应,但这是一个错误。
而不是this移动第一个$.ajax的所有选项并存储为变量...然后每个$.ajax看起来都像$.ajax(optionsObject)。可能还需要超时计数器
@CodyG。 -极好的建议!我要去看看。 BRB
当然,当您观看时,它可以正常工作。但与此同时,我发现了这一点:javascript.info/settimeout-setinterval。使用setInterval()可能是问题所在。
@所有人-参见编辑OP。我感到难过。真奇怪
什么版本的IE?...以及哪个jquery版本
尝试将URL更改为此格式url:"something.ashx?"+(new Date().getTime())
@CodyG。,我不确定它们正在运行哪个版本的IE。我问我的老板(他是唯一有权访问其系统的老板),但从未得到答复。我将为此敦促他。 jQuery版本是3.2.1
在这里找到答案:
当IE调试器打开时,jQuery ajax仅在IE中可用
事实证明,只有IE浏览器会缓存ajax响应。 您必须告诉它不要。 添加cache: false可以解决问题。
function GetData(isFirstLoad) {
//console.log("Attempting to obtain the data...");
jQuery.ajax({
url:"something.ashx",
type:"GET",
contentType: 'application/json; charset=utf-8',
cache: false,
success: function(resultData) {
:)这不会是您的最后一个"啊,那是缓存!" 问题,相信我!
如果您想教育我,我全都听!!
我已经更改了计时器的处理方式,使其不会重叠,但是会等到一个任务完成后再开始下一个任务。 这样做使过程不再超时。 (更改反映在OP中)所以(我可以告诉)剩下的唯一可能是问题的原因是,如果由于某种原因确实发生了超时,该如何处理。
哦,我只是说高速缓存问题会以许多其他变体形式出现,无论是JavaScript还是任何编程语言。 主要是"我认为是它的最新信息",但"我们使它使用了缓存,因此它的速度快而不会"。但是,在调试JavaScript时,Firefox和Chrome都可以选择"在开发人员工具时禁用缓存" 是开放的",我强烈建议您这样做。