У меня есть приложение angular, и я хочу, чтобы оно работало таким образом для каждого HTTP-запроса:
- Не отправлять запрос, если нет сети, и выдает ошибку
- Отменить запрос и выдать ошибку, если состояние сети было изменено на "офлайн"
- Отменить запрос и выдать ошибку, если нет ответа после X миллисекунд
- Вернуть ответ, если все прошло ОК
Прямо сейчас я создал эту службу, которая дает мне состояния сети:
export class ConnectionStateService {
private connectionState = new Subject<ConnectionState>()
private onlineObservable = fromEvent(window, 'online')
private offlineObservable = fromEvent(window, 'offline')
constructor() {
this.onlineObservable.subscribe(event => this.connectionState.next(ConnectionState.ONLINE))
this.offlineObservable.subscribe(event => this.connectionState.next(ConnectionState.OFFLINE))
}
getConnectionState() {
return this.connectionState.asObservable()
}
getOfflineUpdates() {
return this.offlineObservable
}
getCurrentConnectionState() {
return navigator.onLine ? ConnectionState.ONLINE : ConnectionState.OFFLINE
}
}
И реализовал этот Http Interceptor:
const MAX_REQUEST_TIME = 10000
intercept(req, next) {
if (this.connectionStateService.getCurrentConnectionState() === ConnectionState.OFFLINE)
return throwError(new HttpErrorResponse({error: 'Internet is required'}))
return race(
this.connectionStateService.getOfflineUpdates().pipe(mapTo(false)),
timeout(MAX_REQUEST_TIME),
next.handle(req)
)
}
Итак пока перехватчик обрабатывает случаи 1 и 4, но по какой-то причине timeout(MAX_REQUEST_TIME)
не работает, а также this.connectionStateService.getOfflineUpdates().pipe(mapTo(false))
не выдает false
, когда я отключаюсь от сети после отправки запроса. Что я здесь делаю не так?