Javascript HTTP重试更改url';s参数

Javascript HTTP重试更改url';s参数,javascript,angular,http,Javascript,Angular,Http,我创建了一个重试函数,当请求失败时可以调用该函数,以便它可以重试。其思想是,当用户的令牌过期时,请求将失败,因此,如果该令牌过期,它应该刷新该令牌并使用新令牌重试,但仍然使用旧令牌重试。不知道如何使重试考虑新值 这是重试功能: http_retry(maxRetry: number = 5, delayMs: number = 2000) { return (src: Observable<any>) => src.pipe( retry

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

这是重试功能:

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

通过执行
http.get
,您可以创建一个可观察对象,当订阅该对象时,将对传递给
http.get
的url发出一个新的http get请求

在您的代码中,您只执行一次http.get,然后在每次重试时只创建一个对同一源的新订阅

您可以使用
switchMap
操作符来实现所需的结果。只需将
myRequest
更改为以下内容:

myRequest() {
    return of(this.url).pipe(
        switchMap(url => this.http.get<any[]>(
           `${url}?auth=${this.authService.getUserValue().token}`
        ))
    )
}
myRequest(){
返回(this.url).pipe(
switchMap(url=>this.http.get(
`${url}?auth=${this.authService.getUserValue().token}`
))
)
}
这样,源是一个可观察的对象,它发出url(其中没有令牌)

在每次重试时,都会生成一个新的订阅,然后会发生以下情况

  • 可观察的源发出url
  • url通过管道传输到
    switchMap
  • switchMap
    通过调用
    http创建一个新的可观察对象。使用令牌的当前值获取
    ,并返回这个新的可观察对象
  • 订阅Observable会导致它向传递到http.get的url发出请求,并发出响应

  • 谢谢你的回复。我会稍后再尝试,并会有回应
    this.myRequest()
       .pipe(this.http_retry())
       .subscribe(resData => {
          // Logic code
        }
    );
    
    myRequest() {
        return of(this.url).pipe(
            switchMap(url => this.http.get<any[]>(
               `${url}?auth=${this.authService.getUserValue().token}`
            ))
        )
    }