1. ホーム
  2. javascript

[解決済み] コンピュータがスリープ状態になると、setTimeoutはどうなるのでしょうか?

2023-07-17 12:14:38

質問

最近のウェブブラウザで、私が setTimeout を 10 分間実行し (12:00)、5 分後にコンピューターをスリープ状態にした場合、システムが再び起動したときに何が起こるでしょうか? 10 分が経過する前に (12:09 に) 起きた場合、またはずっと後に (16:00 に) 起きた場合はどうなりますか?

私が質問している理由は、10 分ごとに新しい認証トークンを要求させたいからで、長い時間後に起動した場合、ブラウザが正しいことを行ってすぐに新しいトークンを要求するかどうかはわかりません。

明確な説明 : そして、サーバーは古くて無効なトークンを拒否します。

どのように解決するのですか?

私がテストした限りでは、コンピュータが起動した後に停止して再開するだけです。コンピューターが目を覚ますと、setInterval/setTimeout は時間が経過したことを認識しません。

の精度を当てにしない方がいいと思います。 setTimeout/Interval の精度に頼る必要はないと思います。グーグルクロームの場合、私は 最近発見した の場合、タイムアウト/間隔 (1 秒より短い) は、それがアクティブになったタブのフォーカスが失われた場合、1 秒に 1 回に減速されることを最近発見しました。

それとは別に、タイムアウト/間隔の精度は、実行中の他の関数などに依存します。要するに、それはあまり正確ではありません。

ですから、インターバルとタイムアウトを使って、それによって起動した関数内のstarttimeと時刻を照らし合わせれば、より精度が高くなるはずです。たとえば、12:00 に開始し、コンピューターがスリープして 16:13 に起動した場合、12:00 に対して 16:13 をチェックすれば、トークンを更新する必要があることを確認できます。時刻の比較を使用した例を以下に示します。 はこちら