【发布时间】:2018-05-23 23:17:27
【问题描述】:
我有一个非常简单的小过程。我有一个间隔计时器,当它到期时,会向服务器发出 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 上下文,因此该行可能会导致错误或意外行为。 -
尝试把url改成这个表单
url: "something.ashx?"+(new Date().getTime())
标签: javascript jquery ajax