Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Ajuda no funcionamento do método http.get

Olá pessoal, gostaria de uma ajuda no entendimento de um código que estou tentando fazer funciona em Angular.

Na minha aplicação tenho um serviço, abaixo segue o fonte.

import { Order } from './../models/order';
import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http'
import 'rxjs/add/operator/map';

@Injectable()
export class PumpModelsService {

  private filteredPumps = []; 
  public filteredPumpsColumns: string[] = []; 
  public filteredPumpsIndex: string[] = []; 
  private volumetric_eficiency = [];  
  public interference = []; 
  private knn = [];

  constructor(private http: Http) { }

  getKNN() {    
    this.http
    .get('http://127.0.0.1:5000/analise')
    .map(res => res.json())
    .subscribe(result => {
      this.knn = result;
      console.log(this.knn); // linha 44
    }, erro => console.log(erro));    
    console.log(this.knn); //linha 46
    return this.knn;

  }
}

O problema está no método KNN. Reparem que tenho dois console.log(this.knn) neste método. Quando quando chamo o metodo getKNN() o primeiro console.log que esta no escopo do subscribe é impresso normalmente (com os dados que vem do meu back-end) mas quando o segundo console.log é impresso, no escopo do método o resultado é undefined.

Vejam como aparece no console do browser: https://www.dropbox.com/s/dptc4kvvns69k75/console.png?dl=0

Parece que o segundo console.log é executado primeiro e depois o console.log que está dentro do método subscribe.

Esté é o json que é retornado.

{"eficiencia_volumentrica":{"49795":95,"49343":82,"49796":94},
 "interferencia":{"49795":0.2,"49343":0.116,"49796":0.216}}
3 respostas
solução!

Boa tarde, Leandro! Como vai?

Esse é o comportamento padrão, afinal de contas se trata de uma operação assíncrona! Então o que vai acontecer é que seu código vai enviar a requisição GET e mesmo que ela não tenha sido concluída o seu código vai seguir em frente! Por isso que o console.log(this.knn); da linha 46 é apresentado primeiro e com o valor undefined!

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos!

Boa tarde Gabriel, obrigado pela resposta.

Era o que eu suspeitava. O problema que estou tendo com isso é que quando chamo este método em outro componente ele está retornando o undefined e não o resultado real que estou querendo.

this.knn = this.pumpModelsService.getKNN(); // retorna undefined

Isso acontece pelo mesmo motivo! O correto é o seu método retornar o Observable de modo que o componente que o chamar faça o subscribe()! Algo dessa forma:

this.pumpModelsService.getKNN()
     .subscribe(dados => this.knn = dados);