javascript - HTTP 重试更改 url 的参数

标签 javascript angular http

我已经创建了一个重试函数,可以在请求失败时调用它,以便它可以重试。这个想法是当用户的 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 )。

每次重试都会创建一个新订阅,然后会发生以下情况。

  1. 源 Observable 发出 url。
  2. 该 url 通过管道传输到 switchMap
  3. switchMap 通过使用 token 的当前值调用 http.get 创建一个新的 Observable,并且返回这个新的 Observable。
  4. 订阅 Observable 会导致它向传递到 http.get 的 url 发出请求,并发出响应。

关于javascript - HTTP 重试更改 url 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55894910/

相关文章:

javascript - 使用 RequireJS 分离脚本

angular - 无法读取空 Angular 4 的属性 'dispose'

c# - ASP.Net 4 非 MVC API 路由处理程序设计

java - 从 J2ME 客户端轮询 HTTP 服务器

javascript - ng-select 在 angularjs 中不起作用?

javascript - 我误以为我的轮播不工作?

javascript - 使用 jQuery load() 显示来自外部 URL 的内容

json - 错误 TS2339 : Property 'json' does not exist on type 'Object'

angular - typescript : Can't instantiate object using object literals when a function exists in the class

http - 在 Go 中使用表单值发出 HTTP GET