HTTP-попытка изменить параметр URL - PullRequest
4 голосов
/ 29 апреля 2019

Я создал функцию повтора, которая может вызываться при сбое запроса, чтобы он мог повторить его.Идея состоит в том, что запрос завершится неудачно, когда срок действия токена пользователя истек, поэтому, если срок его действия истек, он должен обновить токен и повторить попытку с новым, но он все еще повторяет попытку со старым токеном.Понятия не имею, что нужно сделать, чтобы при повторной попытке учитывалось новое значение.

Это функция повторения:

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
    }
);

1 Ответ

1 голос
/ 29 апреля 2019

Выполнив http.get, вы создаете Observable, который при подписке будет отправлять новый HTTP-запрос GET на URL, который был передан http.get.

В вашем коде вы только когда-либо выполняете 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 (без маркера в нем).

При каждой повторной попытке создается новая подписка, и затем происходит следующее.

  1. Источник Observable испускает URL.
  2. URL попадает в switchMap.
  3. switchMap создает новую Наблюдаемую , вызывая http.get с текущим значением токена, и возвращает эту новую Наблюдаемую.
  4. Подписка на Observable заставляет его сделать запрос к URL-адресу, переданному в http.get, и выдать ответ.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...