Как перезагрузить веб-работников при перезагрузке компьютера из спящего режима? - PullRequest
0 голосов
/ 19 марта 2020

У меня есть простой веб-работник, который поддерживает текущее время часового пояса с помощью setInterval

setInterval(() => {
        userTimezoneTimestamp = userTimezoneTimestamp + 1000
        postMessage(userTimezoneTimestamp);
    }, 1000);

Он работает нормально, пока я не переведу машину в спящий режим. Когда я перезагружаю машину из спящего режима, время, которое я получаю от этого работника, старше. Как я могу перезапустить веб-работника, только когда машина запускается из спящего режима?

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Кажется, что нет события DOM, сообщающего нам об этом событии.

На моем ноутбуке Chrome запускает нестандартное событие Ориентация Абсолютного обмена , но я думаю, не все ноутбуки имеют ориентированное на ориентацию оборудование, и уже просто Firefox на одной машине не запускает его.

Но для того, что вы хотите (всегда актуальное смещение от временной отметки, обслуживаемой API), вам не нужно Вам вообще не нужен ни WebWorker, ни какой-либо таймер, компьютер поставляется с хорошим, и он не только будет обновляться после сна компьютера, он будет даже более точным, чем ваш интервал, который может пострадать от смещения времени.

Все, что вам нужно, это сохранить смещение, полученное от вашего API, и время компьютера, когда вы его получили. Тогда вам просто нужно узнать разницу между текущим и этим временем приема, и вы можете легко получить обновленное смещение.

ОП отметил, что они боятся, что их пользователи изменяют время своего компьютера на более раннюю дату, что приводит к путанице со значениями Date во время работы страницы. Это можно обнаружить . Все, что нужно, это сохранить последнее значение и проверить, является ли разница с текущим значением отрицательной.

( async () => {

  const offset_from_API = await getOffsetFromAPI();
  const time_received = Date.now();
  let last_time = time_received;
  
  
  const getUpToDateOffset = () => {
    const now = Date.now();
    // Anti-Back-Time-Travelling check
    // (it's a good idea to poll this method quite often too update `last_time`)
    if( now - last_time < 0 ) {
      throw new Error( 'cheater detected' );
    }
    last_time = now;
    
    return offset_from_API + (now - time_received);

  };
  
  // to compare we will also use an incrementer
  let incremented = offset_from_API;
  setInterval( () => {
    incremented += 1000;
    console.clear();
    console.log( 'incremented', incremented.toLocaleString( 'en-US' ) );
    console.log( 'difference ', getUpToDateOffset().toLocaleString( 'en-US' ) );
  }, 1000 );
  
} )();

function getOffsetFromAPI() { return 1234567; }
0 голосов
/ 19 марта 2020
setInterval(() => {
        /*handle userTimezoneTimestamp stuff every N miliseconds */
    }, N);


setInterval(() => {
        userTimezoneTimestamp = userTimezoneTimestamp + 1000
        postMessage(userTimezoneTimestamp);
    }, 1000);
...