Extract status code polling logic into a class
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Subject, Subscription, BehaviorSubject } from 'rxjs';
|
||||
import { retryWhen, delay, tap, skip } from 'rxjs/operators';
|
||||
|
||||
export class StatusCodePoller {
|
||||
http: HttpClient;
|
||||
url: BehaviorSubject<string>;
|
||||
pollFreq: number;
|
||||
okCode: number;
|
||||
stopOnOk: boolean;
|
||||
|
||||
pollSubscription: Subscription;
|
||||
urlSubscription: Subscription;
|
||||
poll = new Subject<any>();
|
||||
ok = new Subject<any>();
|
||||
isPolling = new BehaviorSubject<boolean>(false);
|
||||
|
||||
constructor(
|
||||
url: BehaviorSubject<string>, http: HttpClient,
|
||||
pollFreq = 1000, okCode = 200,
|
||||
stopOnOk = true
|
||||
) {
|
||||
this.url = url;
|
||||
this.http = http;
|
||||
this.pollFreq = pollFreq;
|
||||
this.okCode = okCode;
|
||||
this.stopOnOk = stopOnOk;
|
||||
}
|
||||
|
||||
start() {
|
||||
this.stop();
|
||||
if (this.url.value === '') {
|
||||
return;
|
||||
}
|
||||
this.urlSubscription = this.url.pipe(skip(1)).subscribe(() => this.stop());
|
||||
this.isPolling.next(true);
|
||||
this.pollSubscription = this.http.get(this.url.value, {observe: 'response'}).pipe(
|
||||
retryWhen(errors =>
|
||||
errors.pipe(
|
||||
tap(
|
||||
response => {
|
||||
this.poll.next(response);
|
||||
if (response.status === this.okCode) {
|
||||
if (this.stopOnOk) {
|
||||
this.stop();
|
||||
}
|
||||
this.ok.next(response);
|
||||
}
|
||||
}),
|
||||
delay(this.pollFreq)
|
||||
))).subscribe();
|
||||
}
|
||||
|
||||
stop() {
|
||||
this.isPolling.next(false);
|
||||
if (this.pollSubscription) {
|
||||
this.pollSubscription.unsubscribe();
|
||||
}
|
||||
if (this.urlSubscription) {
|
||||
this.urlSubscription.unsubscribe();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user