[解決済み] javascriptで正確なタイマーを作成する方法は?
質問
シンプルで正確なタイマーを作りたいのですが。
これは私のコードです。
var seconds = 0;
setInterval(function() {
timer.innerHTML = seconds++;
}, 1000);
ちょうど3600秒後に、約3500秒を印刷する。
-
なぜ正確ではないのでしょうか?
-
正確なタイマーを作るにはどうしたらいいですか?
どのように解決するのですか?
<ブロッククオートなぜ正確ではないのですか?
を使用しているからです。
setTimeout()
または
setInterval()
.
信頼できない
正確性を保証するものではありません。
ラグが許される
任意に設定でき、一定のペースを保てるわけではありませんが
漂流しがち
(ご観察の通り)です。
正確なタイマーを作るには?
を使用します。
Date
オブジェクトの代わりに、ミリ秒単位の正確な現在時刻を取得します。そして、コールバックが何回実行されたかを数えるのではなく、現在の時刻の値に基づいてロジックを構築します。
単純なタイマーや時計の場合、時刻を記録する 差 を明示する。
var start = Date.now();
setInterval(function() {
var delta = Date.now() - start; // milliseconds elapsed since start
…
output(Math.floor(delta / 1000)); // in seconds
// alternatively just show wall clock time:
output(new Date().toUTCString());
}, 1000); // update about every second
さて、これには値が飛ぶ可能性があるという問題があります。間隔が少し遅れて、コールバックが
990
,
1993
,
2996
,
3999
,
5002
ミリ秒の場合、2回目のカウントが表示されます。
0
,
1
,
2
,
3
,
5
(!). そのため、このようなジャンプを避けるために、100msごとなど、より頻繁に更新することが望ましいでしょう。
しかし、時には、コールバックを実行する間隔を一定に保ちたい場合もあります。これにはもう少し高度な戦略(とコード)が必要ですが、その分利益は大きいです(タイムアウトも少なくなります)。このような場合は 自己調整 タイマーです。ここでは、繰り返されるタイムアウトのそれぞれの正確な遅延は、予想される間隔と比較して、実際に経過した時間に適応されます。
var interval = 1000; // ms
var expected = Date.now() + interval;
setTimeout(step, interval);
function step() {
var dt = Date.now() - expected; // the drift (positive for overshooting)
if (dt > interval) {
// something really bad happened. Maybe the browser (tab) was inactive?
// possibly special handling to avoid futile "catch up" run
}
… // do what is to be done
expected += interval;
setTimeout(step, Math.max(0, interval - dt)); // take into account drift
}
関連
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み】npm install --legacy-peer-deps は具体的に何をするのですか?どんなときに推奨されるのか/どんな使用例が考えられるのか?
-
[解決済み】React-Routerの子が1つしかない。
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み】Jestが予期しないトークンに遭遇した
-
[解決済み】HTMLの最初の行に予期しないトークン<がある。
-
[解決済み】未定義のプロパティ 'forEach' を読み取ることができない