Angular - Catching error after all HTTP retry failed

扶醉桌前 提交于 2019-12-06 14:54:22
    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

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
});

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
}

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!