Extract status code polling logic into a class

This commit is contained in:
Kristóf Tóth
2019-11-07 16:08:54 +01:00
parent 9df954bcb1
commit b45f624ab3
3 changed files with 76 additions and 36 deletions
+63
View File
@@ -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();
}
}
}