2017-07-17 4 views
2

私はsetIntervalという機能を持っています。これは私のウェブサイト上のイベントの残り時間を表示します。しかし、カウントダウンは実際の秒のチックと同期していません。Javascript:実際の秒がチェックされているかどうかを確認しますか?

私のコードでは、サーバーへのajax呼び出しを使用して有効期限を一度取得し、成功するとカウントダウンが開始されます。そこまで偉大な。

var request = new XMLHttpRequest(); 
request.open('GET', 'https://my-website/service.php', true); 
request.onload = function() { 
    if (request.status >= 200 && request.status < 400) { 

     date = request.responseText; 
     timer = setInterval(showRemaining, 1000);//start the countdown 

    } else { 
     // We reached our target server, but it returned an error 
    } 
}; 

しかしsetIntervalが呼び出されたときは、第二の実際のグローバルダニと同期する必要があります。

(私は理にかなって願っています。私は、呼び出しが毎回と同期してお使いのPCのや携帯電話の時計で二回通過する必要が意味する!)

どのように私はそれを達成することができますか?前もって感謝します!

+1

あなたが現在のMSと次のミリ秒(すなわち '1000-(新しいDate()との差との最初の' setTimeout'を行う必要がありgetMilliseconds() ) ')' setInterval'を開始します。setTimeoutには最小値があることに注意してください。その値よりも小さい場合は1000を加算してください。 –

+0

https://stackoverflow.com/a/9647221/2181514 –

+0

もし将来の1週間のように、pc/mobileの時計は異なりますか?ここであなたのサーバークロックとローカルクロックの間のオフセットを見つける方法についてのアドバイスがあります。https://stackoverflow.com/questions/1638337/the-best-way-to-synchronize-client-side-javascript-clock-with-server -date –

答えて

2

あなたが現在のMSと次のミリ秒の差に初期setTimeoutを行う必要があり、すなわち:

1000-(new Date().getMilliseconds())) 

その後、 1000

を追加し、次の第二に、あなたは はsetTimeoutを/のsetIntervalは、最小値(一般的に考えられては10ms)を持っていることに注意してください

のsetInterval

を開始することができますので、その値よりも小さいかどう

また、setTimeout/setIntervalは100%正確ではありませんが、最も近い秒で十分でしょう。

これはあなたの成功コードを与える:。

date = request.responseText; 

var t = 1000-(new Date().getMilliseconds()); 
if (t < 15) t+=1000; 

setTimeout(function() { 
    timer = setInterval(showRemaining, 1000);//start the countdown 
}, t)); 
+0

これは正しいのですが、 'setInterval'はドリフトしないようです - それは[それ自体を修正します](https://stackoverflow.com/questions/985670/will-setinterval-drift)のように見えます。私も何かを学んだ:) – MySidesTheyAreGone

0

@ freedomn-mがコメントに示唆しているように、1000-(new Date().getMilliseconds())は私が探していたコードの重要な部分です - 現在のmsと次のmsの違い。だから私のコードは、今働いていると、それは次のようになります。

if (request.status >= 200 && request.status < 400) { 

    date = request.responseText; 
    setTimeout(function() { 
     timer = setInterval(showRemaining, 1000);//start the countdown 
    }, 1000-(new Date().getMilliseconds()));//to make the calls in sync with actual tick of the second 

} 
関連する問題