我一直在尝试重新创建一个倒数计时器,类似于 gmail 在您与互联网断开连接时使用的倒数计时器。ajax 请求失败,然后它开始一个短暂的倒计时,然后发出另一个 ajax 请求,如果再次失败,则开始一个更长的倒计时,依此类推。一旦达到确定的倒计时值(比如说 1 分钟),倒计时将保持在 1 分钟,直到互联网连接恢复或服务器恢复。
我不想使用插件,因为此代码将嵌入在空间有限的微控制器中,并且出于实际原因也不希望将其作为外部文件放置,即使 jQuery 库已经是外部的。
一切都应该触发onload
,并自动继续(即不使用控制输入)。
到目前为止,如果 ajax 请求成功或立即失败,我已经开发了我想要的代码,但是如果 ajax 请求状态存在延迟(例如服务器关闭),浏览器将不会立即产生结果并且我的代码失败了。
我知道我上面所说的,因为我实际上关闭了服务器,并且得到了 Mozilla Firefox 上的萤火虫的帮助,看到没有立即触发 ajax 结果(成功或失败),而是等待几秒钟。
请帮忙!
html代码:
<div id='tempFail' ></div>
jQuery代码:
$(document).ready(function()
{
//do when DOM ready - http://api.jquery.com/ready/
var timerSpeed = [1000, 5000, 10000, 20000, 30000, 60000];
// current time in ms since 1/1/1970, plus the initial reload interval
var end = (new Date).getTime() + timerSpeed[1];
var n=0;
var m=0;
setInterval(function()
{
var now = (new Date).getTime();
// Current time left to re-load in seconds, sometimes it goes to negative values, see below
var secLeft = Math.floor(( end - now ) / 1000);
// if secLeft is negative multiply by zero...equal to secLeft=0, this will produce an error of one second approximately
var timeToload = (secLeft < 0) ? secLeft * 0 : secLeft;
if (n!=0)
{
//check for failed or delayed request\n\
$('#tempFail').html('Failed or delayed response. Will auto load in: '+timeToload+ ' seconds!');
}
if( (secLeft)<=0)// if reload time is reached do
{
if (m==0)//used to prevent multiple continue reloads when ajax request status is not yet defined
{
m=1;
$.getScript('script_vars.js').done(function (data)
{
//if request succeeded
m=0;
n = 0;
end = (new Date).getTime() + timerSpeed[1];
// Time to load after the initial interval set above
$('#tempFail').html('');
//other code on success here
})
.fail(function()
{
//if request failed
m=0;
n ++;
if(n==6) n=5;
switch(n){ //timer delay for failed request\n\
case 1:
end = (new Date).getTime() + timerSpeed[1];
break;
case 2:
end = (new Date).getTime() + timerSpeed[2];
break;
case 3:
end = (new Date).getTime() + timerSpeed[3];
break;
case 4:
end = (new Date).getTime() + timerSpeed[4];
break;
case 5:
end = (new Date).getTime() + timerSpeed[5];
break;
}
});
}
}
}, 1000);
});