У меня есть следующий сервис для проверки сетевого подключения:
export class InternetService {
public connectionChanged = new BehaviorSubject<boolean>(false);
public connState = true;
constructor(private apiService: ApiService) {
if (navigator.onLine)
this.statusChanged(true);
else
this.statusChanged(false);
this.addEventListeners();
}
private addEventListeners() {
window.addEventListener('online', () => this.statusChanged(true));
window.addEventListener('offline', () => this.statusChanged(false));
}
testConnection() {
this.apiService.callMyMethod().subscribe(res => {
this.connected(true);
}, error => {
this.connected(false);
});
}
statusChanged(connected: boolean) {
if (connected) {
this.testConnection();
} else {
this.connected(false);
}
}
connected(data: boolean) {
this.connState = data;
this.connectionChanged.next(this.connState);
}
}
Функции кода хорошо работают в Edge Browser, но не в Chrome. Я понимаю, что существует проблема для Chrome согласно следующей ссылке:
https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine
В Chrome и Safari, если браузер не может подключиться к локальной сети (LAN) или маршрутизатору, он отключен; все остальные условия возвращают истину. Таким образом, хотя вы можете предполагать, что браузер находится в автономном режиме, когда он возвращает ложное значение, вы не можете предполагать, что истинное значение обязательно означает, что браузер может получить доступ к inte rnet. Вы можете получать ложные срабатывания, например, в тех случаях, когда на компьютере запущено программное обеспечение для виртуализации с виртуальными адаптерами rnet, которые всегда «подключены». Поэтому, если вы действительно хотите определить онлайн-статус браузера, вы должны разработать дополнительные средства для проверки.
В основном на chrome:
(1) navagator .onLine всегда возвращает true; (2) когда я отключаю или переподключаю WiFi, два события «onLine» или «offLine» ничего не делают.
Есть ли альтернативный способ получения событий, когда WiFi отключен или повторно подключен?