Angular - Catching error after all HTTP retry failed

后端 未结 4 1951
走了就别回头了
走了就别回头了 2021-01-07 10:06

I am using Angular Service to get data from my API. I implemented retry feature in case of fetching data fails. Now i need to handle the error when all the retr

相关标签:
4条回答
  • 2021-01-07 10:50

    According to the Errormessage you have CORS issue. You have to enable cors in your SLIM Backend http://www.slimframework.com/docs/v3/cookbook/enable-cors.html

    0 讨论(0)
  • 2021-01-07 10:51

    please try to change this:

    }).pipe(
      retryWhen(errors => errors.pipe(delay(1000), take(10), catchError(this.handleError)))
    );
    

    to this: This might need a tweak for your own code but this approach works for me, the throwError will be catched as errors

    }).pipe(
      mergeMap(x => {
        if(x == error) return throwError('Error!'); //tweak this for your error
        else return of(x);
      }),
      retryWhen(errors => errors.pipe(delay(1000), take(10))), 
      catchError(error => this.handleError(error)) // change here 
    );
    

    and make handle error return observable like:

    handleError(err) {
      ..your code
      return of(err); //and NOT return throwError here
    }
    
    0 讨论(0)
  • 2021-01-07 11:13
        return this.http.get(callURL,{
          params: new HttpParams()
            .set('page', page)
            .set('limit', limit)
        }).pipe(
          retryWhen(genericRetryStrategy({maxRetryAttempts: 10, scalingDuration: 1})),
          catchError(this.handleError)
        );
    

    Where genericRetryStrategy is from this retrywhen resource

    export const genericRetryStrategy = ({
      maxRetryAttempts = 3,
      scalingDuration = 1000,
      excludedStatusCodes = []
    }: {
      maxRetryAttempts?: number,
      scalingDuration?: number,
      excludedStatusCodes?: number[]
    } = {}) => (attempts: Observable<any>) => {
      return attempts.pipe(
        mergeMap((error, i) => {
          const retryAttempt = i + 1;
          // if maximum number of retries have been met
          // or response is a status code we don't wish to retry, throw error
          if (
            retryAttempt > maxRetryAttempts ||
            excludedStatusCodes.find(e => e === error.status)
          ) {
            return throwError(error);
          }
          console.log(
            `Attempt ${retryAttempt}: retrying in ${retryAttempt *
              scalingDuration}ms`
          );
          // retry after 1s, 2s, etc...
          return timer(retryAttempt * scalingDuration);
        }),
        finalize(() => console.log('We are done!'))
      );
    };
    

    Stackblitz

    0 讨论(0)
  • 2021-01-07 11:13

    Have you tried retry(10)? Then in the second subscribe callback you can handle the error:

    return this.http.get(callURL,{
      params: new HttpParams()
        .set('page', page)
        .set('limit', limit)
    }).pipe(
      retry(10)
    ).subscribe((res) => {}, (e) => {
      // handle error
    });
    
    0 讨论(0)
提交回复
热议问题