我已经创建了一个重试函数,可以在请求失败时调用它,以便它可以重试。这个想法是当用户的 token 过期时请求会失败,所以当它过期时,它应该刷新 token 并用新的 token 重试,但它仍然用旧的 token 重试。不知道该怎么做才能让重试考虑到新值。
这是重试函数:
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()))
)
})
)
}
所以这会刷新 token 值(它实际上提供并存储新值,但不会在重试请求中使用它)
这是执行请求的函数:
myRequest(){
return this.http.get<any[]>(
`${this.url}?auth=${this.authService.getUserValue().token}`
);
}
下面是我如何通过重试调用请求:
this.myRequest()
.pipe(this.http_retry())
.subscribe(resData => {
// Logic code
}
);
最佳答案
通过执行 http.get
,您创建了一个 Observable,当它被订阅时,将对传递给 http.get 的 url 发出一个新的 HTTP GET 请求
.
在你的代码中,你只执行一次http.get
,然后retryWhen
只是为每次重试创建一个新的订阅到同一个源Observable。
您可以使用 switchMap
运算符来实现您想要的结果。只需将 myRequest
更改为以下内容:
myRequest() {
return of(this.url).pipe(
switchMap(url => this.http.get<any[]>(
`${url}?auth=${this.authService.getUserValue().token}`
))
)
}
这样源是一个 Observable,它发出 url(其中没有 token )。
每次重试都会创建一个新订阅,然后会发生以下情况。
- 源 Observable 发出 url。
- 该 url 通过管道传输到
switchMap
。 switchMap
通过使用 token 的当前值调用http.get
创建一个新的 Observable,并且返回这个新的 Observable。- 订阅 Observable 会导致它向传递到
http.get
的 url 发出请求,并发出响应。
关于javascript - HTTP 重试更改 url 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55894910/