Ionic2, Http-запрос не работает правильно на стартовой странице

Я создал простое приложение (шаблон бокового меню) и провайдера (conexao-home.ts). На новой странице под названием teste я создал функцию buscarUsuarios (связанную с одной кнопкой), и она вызывает функцию getRemoteUsers в провайдере.

В ionViewDidLoad я сделал тот же вызов функции getRemoteUsers. Когда запускается тестирование страницы, он вызывает функцию и читает данные из http, но не возвращает обратно прочитанные данные обратной переменной. Когда я звоню с кнопки, он возвращает данные с первого чтения и показывает их на странице.

Как это решить?

teste.ts

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { ConexaoHome } from '../../providers/conexao-home';

@Component({
  selector: 'page-teste',
  templateUrl: 'teste.html',
})
export class Teste {

  public users: any;
  public teste: any;

  constructor(public navCtrl: NavController, public navParams: NavParams, public conexaoServico: ConexaoHome) {

  }

  buscarUsuarios() {
    this.users = this.conexaoServico.getRemoteUsers('Pegando os usuários');
    console.log('chamando...');
    console.log(this.users);
    console.log('retornando...' + this.users);
  }

  buscar() {
    this.teste = this.conexaoServico.getRemoteTeste('testando...');
    console.log(this.teste);
  }

  ionViewDidLoad() {
    console.log('ionViewDidLoad Teste');
    //this.buscarUsuarios();
    this.users = this.conexaoServico.getRemoteUsers('Pegando os usuários');
    console.log(this.users);
  }

}

teste.html

<ion-header>
  <ion-navbar>
    <button ion-button menuToggle>
      <ion-icon name="menu"></ion-icon>
    </button>
    <ion-title>Teste</ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding="false">
  <button ion-button (click)="buscarUsuarios()">Pegar Dados</button>
  <br>
  <button ion-button (click)="buscar()">Pegar Dados 2</button>
  {{ teste }}
  <br>
  <ion-list>
    <button ion-item *ngFor="let user of users">
      <ion-avatar item-left>
        <img src="{{ user.picture.medium }}">
      </ion-avatar>
      <h2 text-wrap>{{ user.name.title }} {{ user.name.first }} {{ user.name.last }}</h2>
      <h3 text-wrap>{{ user.email }}</h3>
    </button>
  </ion-list>
</ion-content>

провайдер conexao-home.ts

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';

@Injectable()
export class ConexaoHome {

  public usuarios: any;
  public areas: any;

  constructor(public http: Http) {
    console.log('Hello ConexaoHome Provider');
  }

  getRemoteUsers(tipo) {
    this.http.get('https://randomuser.me/api/?results=10').
    map(res => res.json()
    ).subscribe(data => {
      console.log(data.results);
      console.log(tipo);
      this.usuarios = data.results;
    });
    return this.usuarios;
  }

  getRemoteTeste(tipo) {
    console.log(tipo);
    return ('teste executado 2');
  }
}

Tks.

1 ответ

Решение

Вы не можете сделать это так:

getRemoteUsers(tipo) {
    this.http.get('https://randomuser.me/api/?results=10').
    map(res => res.json()
    ).subscribe(data => {
      console.log(data.results);
      console.log(tipo);
      this.usuarios = data.results;
    });
    return this.usuarios;
}

Это может закончить оператор возврата до завершения асинхронного вызова. Потому что вы сделали асинхронный HTTP-запрос через Observable. Вы должны прочитать больше об этом здесь

Вместо этого, пожалуйста, попробуйте что-то вроде этого:

getRemoteUsers(tipo) {
    return this.http
      .get('https://randomuser.me/api/?results=10')
      .map(res => res.json())
}

Тогда вы должны использовать это так:

ionViewDidLoad() {
    this.conexaoServico.getRemoteUsers('Pegando os usuários').subscribe((data) => { 
       this.users = data;
       console.log(this.users);
    });
}
Другие вопросы по тегам