1
resposta

Como refazer a requisição dentro do catch error

Boa noite,

Tenho um requisição que frequentemente retorna timeout na primeira tentativa. Para contornar o problema gostaria de capturar o erro de timeout e refazer a mesmo requisição. Poderia me dar um exemplo de como ficaria esse código?

1 resposta

Olá Diego, tudo bem com você?

Peço desculpas pela demora em obter um retorno.

Para refazer a requisição, você pode utilizar o operador retry do RxJS para refazer a requisição em caso de erro. Por exemplo:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError, retry } from 'rxjs/operators';

@Injectable()
export class DataService {
  constructor(private http: HttpClient) {}

  public fazerRequisicao(): Observable<any> {
    const url = 'https://exemplo.com/api/requisicao';

    return this.http.get(url).pipe(
      retry(2),
      catchError((error) => {
        if (error.status === 408) {
          console.log('Erro de timeout. Tentando novamente...');
          return this.fazerRequisicao();
        } else {
          return throwError(error);
        }
      })
    );
  }
}

No exemplo acima, o operador retry está definido com 2 tentativas. Ou seja, caso ocorra um erro na primeira tentativa, o operador irá tentar novamente mais duas vezes. Além disso, dentro do bloco catchError, verificamos se o erro é um erro de timeout (status HTTP 408). Se for, fazemos uma chamada recursiva para o método fazerRequisicao() para refazer a requisição. Caso contrário, retornamos o erro original utilizando throwError.

Vale ressaltar que na próxima aula catchError e throwError a instrutora irá ensinar a trabalhar com manipulação de erros no Angular. Todavia, deixo também a documentação do método retry caso queira se aprofundar:

Espero ter ajudado. Continue mergulhando em conhecimento e não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!