Я взломал устройство 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);
});
}