Опрос - ›Процесс проверки его готовности или, другими словами, повторное обращение к серверу, а когда он будет готов, обработайте окончательные данные.
Пример: - Если я получаю от сервера истинный статус, то мне нужно показать пользователю, что обработка завершена, если нет, то обработка все еще продолжается.
Мы можем сделать этот опрос в Angular, используя библиотеку RxJs (Reactive Extensions for JavaScript).
Я задействую API с помощью функций HttpClient и RxJs в Angular 7 и проверю, выполняется ли обработка, каждые 3 секунды я проверяю статус обработки, независимо от того, завершена она или нет. Если из бэкэнда, когда я получал, обработка завершена, то с этого момента я не буду нажимать API, поскольку обработка завершена.
Давайте импортируем функции, которые нужно использовать для опроса.
import { concatMap, map, switchMap, filter, take} from 'rxjs/operators';
import { timer, BehaviorSubject } from 'rxjs';
import { HttpClient } from '@angular/common/http';
Для Hit API необходимо импортировать модуль HttpClient.
const url$ = this.http.get('my-api-url');// api url
this.loading$.pipe(
switchMap(_ => timer(0, 3000).pipe(
concatMap(_ => url$),
map((response: ServerResponse) => {
return response;
})
).pipe(filter(data => data.generated===true))
.pipe(take(1)
)
)
.subscribe(()=> {console.log('done')})
В приведенных выше функциях я вызываю API каждые 3 секунды после получения ответа, а затем регистрирую свой статус как «готово». ServerResponse - это интерфейс, на который мы получаем тип ответа от API.
Теперь я объединю весь код в один файл, т.е. файл ts (файл логики в версиях Angular 2+).
import { concatMap, map, switchMap, filter, take} from 'rxjs/operators';
import { timer, BehaviorSubject } from 'rxjs';
import { HttpClient } from '@angular/common/http';
export interface ServerResponse{
generated: boolean
}
export class AppComponent implements OnInit {
loading$ = new BehaviorSubject('');
constructor(private http: HttpClient) { }
ngOnInit() {
const url$ = this.http.get('my-api-url');
this.loading$.pipe(
switchMap(_ => timer(0, 3000).pipe(
concatMap(_ => url$),
map((response: ServerResponse) => {
return response;
})
).pipe(filter(data => data.generated===true))
.pipe(take(1))
)
)
.subscribe(()=> {console.log('done')})
}
ngOnDestroy(): void {
/**
* Unsubscribe all subscriptions to avoid memory leak
*/
//here will do unsubscribe
}
}
Теперь приведенный выше код выполняет опрос с использованием функций RXJS. Другой способ, мы также можем использовать функцию `setInterval`, а затем создать переменную с именем‘ isDone ’и установить значение false при обработке, и эта переменная должна быть проверена перед обращением к API.
Удачного кодирования с использованием RXJS и Angular. 😊