Rx js Refre sh токен и вызов одного и того же API с использованием ioni c native http plugin - PullRequest
1 голос
/ 14 апреля 2020

Я изучаю Rx js и работаю над приложением ioni c 4, которое использует плагин ioni c -ative http для вызова API (возвращает обещание). Я использую приведенный ниже код для выполнения вызова API / refre sh token logi c.

Код файла утилиты: (Используется из оператора для преобразования обещания в наблюдаемое)

from(this.http.get(url, param, headerMap)); 

Код файла сервиса

return this.utilService.httpCall2('GET', taskURL, null, null).pipe(catchError(err=>{
        if(err.status==401){
          // return  this.utilService.refreshTokenAndRetryCall2().toPromise().then(()=>{
          //   return this.utilService.httpCall2('GET', taskURL, null, null);
          // });
          return this.utilService.refreshTokenAndRetryCall2()
        }
        else{
          throw err;
        }
      }
    ),
      tap(resp => console.log("API response is", JSON.stringify(resp))), map(resp => JSON.parse(resp.data)),
      tap(resp => console.log("parsed data is ", JSON.stringify(resp))));

I хотите достичь нижеприведенного сценария

  1. Вызов API с использованием утилиты http method this.utilService.httpCall2 ('GET', taskURL, null, null).
  2. Если срок действия токена истек, API возвращает 401 и вызывает метод refre sh token.
  3. После refre sh токен снова вызывает исходный API для получения нужных данных

Итак, проблема, с которой я сталкиваюсь, заключается в вызове refreshTokenAndRetryCall2 (). Я не могу выполнить оригинал вызов API с токеном refre sh (т. е. this.utilService.httpCall2 ('GET', taskURL, null, null)

1 Ответ

0 голосов
/ 15 апреля 2020

Таким образом, оператор catchError на самом деле имеет два параметра error & source. Источник представляет собой наблюдаемый источник, поэтому вы можете сделать следующее:

return this.utilService.httpCall2('GET', taskURL, null, null).pipe(catchError((err, source) =>{
        if(err.status==401){
          return  this.utilService.refreshTokenAndRetryCall2().pipe(
            switchMapTo(source)
          )
        }
       ...

Просто не забудьте встроить какой-нибудь автоматический выключатель, в противном случае вы можете оказаться в бесконечном l oop

...