3
respostas

Resultado de um serviço dentro de variável no componente undefined

Tenho um serviço e ele me retorna meus dados. Funcionando ok.

Meu problema é que preciso setar uma variável dentro do componente com o retorno do serviço, mas ele retorna undefined.

// componente

public resultado:  any;

  public constructor(private myService: MyService) { }

  public ngOnInit(): any {
    console.log(this.resultado ); / <-- undefined, mas correto
    this.getDados();
    console.log(this.resultado );  // <-- undefined
  } 

  getDados() {
    this.myService.getData().subscribe(res => {
        this.resultado = res;
        console.log(this.resultado); // <--exibe corretamente o retorno
    });
  }

Como obter o retorno dentro da minha variável? Percebi que deve ter algo haver com a ordem que as coisas são realizadas. Já que o ultimo console.log exibido é o de dentro da chamada do serviço.

3 respostas

Consegui mitigar meu problema, mas não resolvi ele. Eu estou chamando uma fn dentro do retorno do subscribe do serviço e passo o resultado como parâmetro.

  • Qual a necessidade de declarar a variável "resultado" como "any" ? Qual é o tipo de dado de retorno do seu serviço ?

  • Você compreende perfeitamente os conceitos de assíncrono e síncrono ?

Síncrona

Quando uma requisição é enviada, o processo remetente é bloqueado até que ocorra uma resposta, ou seja, não é possível enviar novas requisições até que nossa requisição atual seja finalizada, existe sincronismo entre as requisições.

Assíncrona

Em uma requisição assíncrona, não existe sincronismo entre as requisições, sendo assim, podemos enviar diversas requisições em paralelo, onde cada resposta retorna quando estiver pronta.

  • Este problema provavelmente está ocorrendo porque o Javascript é assíncrono e está tratando suas requisições como tal. Compare seu código com a explicação e demonstração em Angular 2 - Services que você provavelmente compreenderá como tratar seu código enquanto sua requisição de serviço (REQUEST) é processada e você ainda não recebeu a resposta (RESPONSE) para inserir o conteúdo na variável a qual está UNDEFINED .

  • Dá uma boa lida na documentação de serviços do Angular 2 e se você não dominar o conceito de fluxo de execução assíncrono leia também Tableless - Fluxo de execução assíncrono em Javascript - Callbacks.

Se eu conseguir te ajudar de alguma forma mantenha-me informado. Espero que consiga resolver seu problema.

Victor obrigado pela ajuda. Entendo o conceito de forma geral, mas gostaria de saber se existe alguma forma de garantir assim como existe em outras tecnologias.

Pelo que li não existe.