Javascript setInterval计时器上的Ajax调用不工作
我有一个非常简单的小流程。我有一个间隔计时器,当它过期时,会向服务器发出ajax调用。使用返回的json,它将解析出来并更新DOM。设置间隔设置为1秒。然后服务器对数据库执行一个非常简单的选择。它执行一个需要毫秒才能执行的查询,如果需要的话 在我们的测试服务器上,它运行良好。但是,当它部署到我们的客户时,大多数情况下实际上并没有访问数据库。我们可以在查询分析器中看到它。应该有一个连续的查询流,但它们最多是零星的,通常在点击之间间隔40秒或更长时间 代码如下:Javascript setInterval计时器上的Ajax调用不工作,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一个非常简单的小流程。我有一个间隔计时器,当它过期时,会向服务器发出ajax调用。使用返回的json,它将解析出来并更新DOM。设置间隔设置为1秒。然后服务器对数据库执行一个非常简单的选择。它执行一个需要毫秒才能执行的查询,如果需要的话 在我们的测试服务器上,它运行良好。但是,当它部署到我们的客户时,大多数情况下实际上并没有访问数据库。我们可以在查询分析器中看到它。应该有一个连续的查询流,但它们最多是零星的,通常在点击之间间隔40秒或更长时间 代码如下: setTimeout(functio
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());
…时间像时钟一样每秒钟刷新一次,即使数据库从未被命中
我可以在错误
中的调试工具中设置断点,它永远不会被命中
如果我们点击refresh,它会工作或几秒钟(我们可以看到查询命中数据库),但随后它会再次减慢速度
令人沮丧的是,它在我们的测试服务器上完美地工作。但很明显,我忽略了一些东西
编辑:
好吧,这真的很奇怪。当我打开调试器时,它会工作。一旦我关闭调试器,它就会停止工作。我甚至不必让网络选项卡运行和捕获事件。只要打开调试器窗口,它就可以工作
这是IE,这是客户正在使用的,因此它是我们唯一的选择。在这里找到了答案:
事实证明,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) {
在这里找到了答案:
事实证明,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) {
什么是$.ajax(这个)代码>??是否调用了错误回调?顺便说一句,如果在另一个部署中整个事情都很好,那么你很难期望这是一个编程问题……我在这里的另一个线程上发现,当我试图弄清楚如何使ajax调用在超时的情况下自动执行。也就是说,我可以在我的测试服务器和客户机的生产服务器上设置一个断点,它永远不会被击中。一旦设置了超时:0
它就再也不会超时了。。。我认为这很好。我从来没有听说过,我非常怀疑它能做到这一点。此设置的内容取决于JS上下文,因此该行可能会导致错误或意外行为。请尝试将url更改为此表单url:“something.ashx?”+(new Date().getTime())
什么是$.ajax(this)代码>??是否调用了错误回调?顺便说一句,如果在另一个部署中整个事情都很好,那么你很难期望这是一个编程问题……我在这里的另一个线程上发现,当我试图弄清楚如何使ajax调用在超时的情况下自动执行。也就是说,我可以在我的测试服务器和客户机的生产服务器上设置一个断点,它永远不会被击中。一旦设置了超时:0
它就再也不会超时了。。。我认为这很好。我从来没有听说过,我非常怀疑它能做到这一点。此
设置的内容取决于JS上下文,因此该行可能会导致错误或意外行为。请尝试将url更改为此表单url:“something.ashx?”+(new Date().getTime())
:)这不会是您的最后一个“啊,这是缓存!”问题,相信我!如果你想教育我,我洗耳恭听!!我已经改变了计时器的处理方式,这样它就不会重叠,而是等到一个任务完成后再开始下一个任务。这样做使过程不再超时。(OP中反映的更改)所以唯一剩下的问题(我可以说)可能是如何处理超时是否出于某种原因。哦,我只是说缓存问题在许多其他变体中出现,无论是javascript还是任何编程语言。主要是“我认为这是最新的信息”,但“我们让它使用缓存,所以它很快,所以它不是”。。。然而,在调试javascript时,Firefox和Chrome都有一个选项“在开发人员工具打开时禁用缓存”,我强烈建议::)这不会是你最后一个“它是缓存!”问题,相信我!如果你想教育我,我洗耳恭听!!我已经改变了计时器的处理方式,这样它就不会重叠,而是等到一个任务完成后再开始下一个任务。这样做使过程不再超时。(OP中反映的更改)所以唯一剩下的问题(我可以说)可能是如何处理超时是否出于某种原因。哦,我只是说缓存问题在许多其他变体中出现,无论是javascript还是任何编程语言。主要是“我认为这是最新的信息”,但“我们让它使用缓存,所以它很快,所以它不是”。。。然而,在调试javascript时,Firefox和Chrome都可以选择“在开发人员工具打开时禁用缓存”,我强烈建议这样做。