У меня проблема с опросом некоторых данных с помощью запроса GET от API.Я хотел бы опрашивать данные каждую 1 секунду, до 30 секунд.Дело в том, что angular, кажется, выполняет запросы (это протоколирование ответа), хотя на самом деле он не выполняет запрос к серверу .
Я написал следующие методы в своем сервисе:
private pollStatus(token: string, remember: boolean):Observable<any> {
const httpOptions = {
headers: new HttpHeaders({
'Token': token,
'Remember': '' + remember
})
};
const url = 'auth/status';
return this.http.get<any>(url, httpOptions).pipe(map(response => {
console.log('polldata', response.status);
return response;
}));
}
public secondFactor(token: string, remember: boolean): Observable<any> {
let pollData$ = this.pollStatus(token, remember);
let watchdog = timer(30 * 1000);
// this.http.post<any>('/auth/login', {}).subscribe();
return Observable.create(subject => {
let pollSubscription = pollData$.pipe(expand(_ => timer(1000).pipe(concatMap(_ => pollData$))), takeUntil(watchdog)).subscribe(response => {
console.log('secondFactor', response.status);
// some action based on the response is performed here
});
});
}
В компоненте, который я называю так:
public ngOnInit(): void {
this.authService.secondFactor(this.authyToken, true).subscribe(response => {
console.log('response in component', response);
});
}
В консоли я вижу, что подписка на запрос get выполняется несколько раз (код: console.log('polldata', response.status);
выполнено).К сожалению, только один запрос выполняется к серверу (проверено на бэкэнде и на вкладке сети).
Вывод на консоль:
polldata pending
secondFactor pending
polldata pending
secondFactor pending
polldata pending
secondFactor pending
polldata pending
secondFactor pending
polldata pending
secondFactor pending
etc. etc. etc.
Iпроверил это поведение в разных браузерах (Safari & Chrome) - та же проблема.
Обходной путь:
Я обнаружил, что если я отправлю некоторый POST-запрос намой сервер (прокомментированная строка: // this.http.post<any>('/auth/login', {}).subscribe();
в методе secondFactor()
), затем Angular начинает выполнять запросы GET более одного раза.