Опрос - ›Процесс проверки его готовности или, другими словами, повторное обращение к серверу, а когда он будет готов, обработайте окончательные данные.
Пример: - Если я получаю от сервера истинный статус, то мне нужно показать пользователю, что обработка завершена, если нет, то обработка все еще продолжается.
Мы можем сделать этот опрос в 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. 😊