Убедитесь, что повторные вызовы для извлечения не останавливаются, когда пользователь не взаимодействует с вкладкой?
Я взломал (IOT) устройство IOT, которое доступно в моей домашней сети на 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);
});
}