我创建了一个重试函数,当请求失败时可以调用该函数,以便它可以重试它。想法是,当用户的令牌过期时,请求将失败,因此,如果请求过期,则应刷新令牌并使用新的令牌重试,但仍使用旧的令牌重试。不知道要怎么做才能让重试考虑新值。
这是重试功能:
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
}
);
答案 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(其中没有令牌)。
每次重试都会创建一个新的订阅,然后将发生以下情况。
switchMap
。switchMap
通过使用令牌的当前值调用http.get
创建一个新的Observable ,并返回此新的Observable。 http.get
的url发出请求,并发出响应。