我已经创建了一个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()))
)
})
)
}
因此,这将刷新令牌值(它实际上给出并存储了新值,但在重试请求中不使用它)。
这是执行请求的函数:
myRequest(){
return this.http.get<any[]>(
`${this.url}?auth=${this.authService.getUserValue().token}`
);
}
下面是通过重试调用请求的方式:
this.myRequest()
.pipe(this.http_retry())
.subscribe(resData => {
// Logic code
}
);
发布于 2019-04-28 23:00:47
通过执行HTTP,您可以创建一个可观察到的http.get
**,,它在订阅时将向传递给** http.get
**.**的url发出一个新的HTTP请求。
在您的代码中,您只执行过一次http.get
,然后retryWhen
只为每次重试创建一个新的订阅到相同的源代码。
您可以使用switchMap
操作符来实现您想要的结果。只需将myRequest
更改为:
myRequest() {
return of(this.url).pipe(
switchMap(url => this.http.get<any[]>(
`${url}?auth=${this.authService.getUserValue().token}`
))
)
}
这样,源是一个可观察的,它发出url (其中没有标记)。
在每次重试时,将进行新的订阅,然后将发生以下情况。
switchMap
中。switchMap
通过调用带有令牌当前值的http.get
来创建一个新的可观测,并返回这个新的可观测值。http.get
的url发出请求,并发出响应。https://stackoverflow.com/questions/55894910
复制相似问题