HTTP重试更改URL的参数

时间:2019-04-28 21:56:15

标签: javascript angular http

我创建了一个重试函数,当请求失败时可以调用该函数,以便它可以重试它。想法是,当用户的令牌过期时,请求将失败,因此,如果请求过期,则应刷新令牌并使用新的令牌重试,但仍使用旧的令牌重试。不知道要怎么做才能让重试考虑新值。

这是重试功能:

http_retry(maxRetry: number = 5, delayMs: number = 2000) {
        return (src: Observable<any>) => src.pipe(
            retryWhen(_ => {
                return interval(delayMs).pipe(
                    flatMap(count => count == maxRetry ? throwError("Giving up") : of(this.authService.refreshToken()))
                )
            })
        )
}

因此,这将刷新令牌值(它实际上提供并存储了新值,但未在重试的请求中使用它)

这是执行请求的功能:

myRequest(){
        return this.http.get<any[]>(
            `${this.url}?auth=${this.authService.getUserValue().token}`
        );
}

这是我通过重试调用请求的方式:

this.myRequest()
   .pipe(this.http_retry())
   .subscribe(resData => {
      // Logic code
    }
);

1 个答案:

答案 0 :(得分:1)

通过执行http.get,您将创建一个Observable,当其被订阅时,它将对传递给http.get的URL发出新的HTTP GET请求。 < / p>

在您的代码中,您只能执行一次http.get,然后retryWhen只会为每次重试创建一个可观察到的相同源的新订阅。

您可以使用switchMap运算符来获得所需的结果。只需将myRequest更改为以下内容即可:

myRequest() {
    return of(this.url).pipe(
        switchMap(url => this.http.get<any[]>(
           `${url}?auth=${this.authService.getUserValue().token}`
        ))
    )
}

这样,源是一个Observable,它发出url(其中没有令牌)。

每次重试都会创建一个新的订阅,然后将发生以下情况。

  1. Observable源发出URL。
  2. 该网址通过管道传递到switchMap
  3. switchMap 通过使用令牌的当前值调用http.get创建一个新的Observable ,并返回此新的Observable。
  4. 订阅Observable会使它对传递到http.get的url发出请求,并发出响应。