首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HTTP重试更改url的参数

HTTP重试更改url的参数
EN

Stack Overflow用户
提问于 2019-04-28 21:56:15
回答 1查看 894关注 0票数 4

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

这是重试功能:

代码语言:javascript
运行
复制
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()))
                )
            })
        )
}

因此,这将刷新令牌值(它实际上给出并存储了新值,但在重试请求中不使用它)。

这是执行请求的函数:

代码语言:javascript
运行
复制
myRequest(){
        return this.http.get<any[]>(
            `${this.url}?auth=${this.authService.getUserValue().token}`
        );
}

下面是通过重试调用请求的方式:

代码语言:javascript
运行
复制
this.myRequest()
   .pipe(this.http_retry())
   .subscribe(resData => {
      // Logic code
    }
);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-28 23:00:47

通过执行HTTP,您可以创建一个可观察到的http.get**,,它在订阅时将向传递给** http.get**.**的url发出一个新的HTTP请求。

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

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

代码语言:javascript
运行
复制
myRequest() {
    return of(this.url).pipe(
        switchMap(url => this.http.get<any[]>(
           `${url}?auth=${this.authService.getUserValue().token}`
        ))
    )
}

这样,源是一个可观察的,它发出url (其中没有标记)。

在每次重试时,将进行新的订阅,然后将发生以下情况。

  1. 可观察到的源发出url。
  2. url通过管道传输到switchMap中。
  3. switchMap 通过调用带有令牌当前值的http.get来创建一个新的可观测,并返回这个新的可观测值。
  4. 订阅可观察到的内容会使它向传递到http.get的url发出请求,并发出响应。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55894910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档