Убедитесь, что повторные вызовы для извлечения не останавливаются, когда пользователь не взаимодействует с вкладкой? - PullRequest
0 голосов
/ 25 февраля 2019

Я взломал устройство IOT (Imple), которое доступно в моей домашней сети по адресу 192.168.1.1 (например).

Это предоставляет конечную точку HTTP (notify.txt), которая дает мнесостояние системы.

Я играл и также обслуживаю (notify.html и notify.js), который проверяет статус (notify.txt) примерно каждые 1-2 секунды и создает уведомление, если есть какие-либо новые данные.

Однако, если я работаю над другими вещами в браузере (в настоящее время Chrome), в конце концов эти запросы перестают выполняться со скоростью примерно 1-2 в секунду.

Ниже вы можетепосмотрим, когда процесс начнет замедляться.Я могу заставить процесс «ускориться» снова, вернувшись к вкладке и открыв инструменты разработчика.(В настоящее время я испытываю это на рабочем столе).

2019:19:14:50
2019:19:14:51
2019:19:14:52
2019:19:14:53
2019:19:14:54
2019:19:14:56
2019:19:14:58
2019:19:15:00
2019:19:15:02
2019:19:15:04
2019:19:15:06
2019:19:15:16
2019:19:15:28
2019:19:15:40
2019:19:15:54
2019:19:16:10

Есть ли что-нибудь, что можно сделать, чтобы изменить то, как эти вкладки "задокументированы" и гарантировать, что они продолжают отправлять запросы, которые я хочу, чтобы они? (Моя терминология может быть плохой, так как я не совсем знаком с web dev / javascript, просто играю в соответствии с моими потребностями.)

В настоящее время мой код (примерно) выглядит следующим образом, с checkUpdate работает под нагрузкой.

var lastText = undefined;
function checkUpdate() {
  fetch("notify.txt")
    .then(function(response) {
      if (response.status === 200) {
        return response.text()
      } else {
        console.log("Fetch error!");
        return Promise.resolve(lastText);
      }
    })
    .then(function(responseText) {
      // No update. Check again in one second.
      if (responseText === lastText) {
        setTimeout(checkUpdate, 1000);
        return;
      }

      let shouldTryNotify = true;
      if (lastText !== undefined) {
        lastText = responseText;
      } else {
        shouldTryNotify = false;
        lastText = responseText.slice();
        responseText = "Notifications will go here. :)";
      }

      if (shouldTryNotify) {
        // empty.js is an empty file.
        navigator.serviceWorker.register("empty.js");
        Notification.requestPermission(function(result) {
          if (result === "granted") {
            navigator.serviceWorker.ready.then(function(registration) {
              registration.showNotification(responseText);
            });
          }
        });
      }
      setTimeout(checkUpdate, 1000);
    })
    .catch(function() {
      console.log("Error!");
      setTimeout(checkUpdate, 1000);
    });
}
...