سعی مجدد خودکار درخواستهای با شکست مواجه شده در برنامههای Angular
نویسنده: وحید نصیری
تاریخ: ۱۳۹۷/۰۳/۰۳ ۱۳:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
import { Observable } from "rxjs";
import { catchError, map, retry } from "rxjs/operators";
postEmployeeForm(employee: Employee): Observable<Employee> {
const headers = new HttpHeaders({ "Content-Type": "application/json" });
return this.http
.post(this.baseUrl, employee, { headers: headers })
.pipe(
map((response: any) => response["fields"] || {}),
catchError(this.handleError),
retry(3)
);
} import { Observable, of, throwError as observableThrowError, throwError } from "rxjs";
import { catchError, delay, map, retryWhen, take } from "rxjs/operators";
postEmployeeForm(employee: Employee): Observable<Employee> {
const headers = new HttpHeaders({ "Content-Type": "application/json" });
return this.http
.post(this.baseUrl, employee, { headers: headers })
.pipe(
map((response: any) => response["fields"] || {}),
retryWhen(errors => errors.pipe(
delay(1000),
take(3)
)),
catchError(this.handleError)
);
} import { Observable, of, throwError as observableThrowError, throwError } from "rxjs";
import { catchError, delay, map, mergeMap, retryWhen, take } from "rxjs/operators";
postEmployeeForm(employee: Employee): Observable<Employee> {
const headers = new HttpHeaders({ "Content-Type": "application/json" });
return this.http
.post(this.baseUrl, employee, { headers: headers })
.pipe(
map((response: any) => response["fields"] || {}),
retryWhen(errors => errors.pipe(
mergeMap((error: HttpErrorResponse, retryAttempt: number) => {
if (retryAttempt === 3 - 1) {
console.log(`HTTP call failed after 3 retries.`);
return throwError(error); // no retry
}
switch (error.status) {
case 400:
case 404:
return throwError(error); // no retry
}
return of(error); // retry
}),
delay(1000),
take(3)
)),
catchError(this.handleError)
);
} import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { Observable, of, throwError } from "rxjs";
import { catchError, delay, mergeMap, retryWhen, take } from "rxjs/operators";
@Injectable()
export class RetryInterceptor implements HttpInterceptor {
private delayBetweenRetriesMs = 1000;
private numberOfRetries = 3;
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
retryWhen(errors => errors.pipe(
mergeMap((error: HttpErrorResponse, retryAttempt: number) => {
if (retryAttempt === this.numberOfRetries - 1) {
console.log(`HTTP call '${request.method} ${request.url}' failed after ${this.numberOfRetries} retries.`);
return throwError(error); // no retry
}
switch (error.status) {
case 400:
case 404:
return throwError(error); // no retry
}
return of(error); // retry
}),
delay(this.delayBetweenRetriesMs),
take(this.numberOfRetries)
)),
catchError((error: any, caught: Observable<HttpEvent<any>>) => {
console.error({ error, caught });
if (error.status === 401 || error.status === 403) {
// this.router.navigate(["/accessDenied"]);
}
return throwError(error);
})
);
}
} providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: RetryInterceptor,
multi: true
},