Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Duvida sobre o Observable Subscribe

Gostaria de entender porque não o typescript não consegue fazer o tratamento ou no caso o subscribe no mesmo metodo, somente funciona quando retorno o observable e na chamada do metodo obterContato() ai sim o typescript consegue realizar a subscrição dos dados corretamente. Alguém sabe o motivo, pesquisei e não achei.

public obterContatos(): Contato[] {

  

    this.http.get<Contato[]>(this.APIContatos)
      .pipe(retry(2),catchError(this.handleError))
      .subscribe((lista:Contato[]) => {
        this.contatos = lista;
      });


      return this.contatos;

  }
1 resposta
solução!

Olá Lucas!

Entendo sua dúvida e vou tentar te ajudar. O que está acontecendo no seu código é um comportamento comum quando lidamos com Observables no Angular. Vamos lá:

Quando você faz uma requisição HTTP usando o HttpClient, ele retorna um Observable. Esse Observable é uma representação de um fluxo de dados que pode ser assíncrono. Ou seja, a resposta da requisição não chega imediatamente, e por isso, o Observable precisa ser "observado" para que possamos reagir quando os dados finalmente chegarem.

No seu método obterContatos, você está tentando retornar this.contatos imediatamente após a chamada do subscribe. No entanto, o subscribe é assíncrono, o que significa que o retorno de this.contatos acontece antes mesmo de a resposta da requisição HTTP ter sido recebida e processada. Por isso, this.contatos acaba sendo retornado vazio ou indefinido.

Para resolver isso, você deve retornar o Observable do método obterContatos e fazer o subscribe onde você realmente precisa dos dados, geralmente no componente. Assim, o componente pode "se inscrever" no Observable e reagir quando os dados estiverem prontos. Aqui está um exemplo de como isso pode ser feito:

// No seu service
public obterContatos(): Observable<Contato[]> {
  return this.http.get<Contato[]>(this.APIContatos)
    .pipe(
      retry(2),
      catchError(this.handleError)
    );
}

// No seu componente
ngOnInit() {
  this.seuService.obterContatos().subscribe((lista: Contato[]) => {
    this.contatos = lista;
  });
}

Dessa forma, o componente atua como um Observer, que se inscreve no Observable retornado pelo service e atualiza this.contatos quando os dados são recebidos.

Espero ter ajudado e bons estudos!