インターネットから切断されたときにgmailが使用するものと同様のカウントダウンタイマーを再作成しようとしています。ajax リクエストが失敗すると、短いカウントダウンが開始され、別の ajax リクエストが行われ、再び失敗した場合は、より長いカウントダウンが開始されます。決定されたカウントダウン値 (たとえば 1 分) に達すると、インターネット接続が回復するか、サーバーが復旧するまで、カウントダウンは 1 分に維持されます。
このコードは、スペースが限られているマイクロコントローラーに埋め込まれ、jQuery ライブラリが既に外部にあるにもかかわらず、実用的な理由から外部ファイルとして配置したくないため、プラグインを使用したくありません。
すべてがトリガーonload
され、自動的に続行されます (つまり、制御入力は使用されません)。
これまでのところ、ajax リクエストが成功または失敗した場合に必要なことを実行するコードを開発しましたが、ajax リクエストのステータスに遅延がある場合 (サーバーがダウンしている場合など)、ブラウザーはすぐに結果を生成せず、私のコードは失敗します。
私は実際にサーバーを停止し、Mozilla Firefox の firebug の助けを借りて、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);
});