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?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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?
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!