Ionic2,Http 请求在起始页中无法正常工作
Ionic2, Http request don´t work correctly in starting page
我创建了一个简单的应用程序(侧边菜单模板)和一个提供程序 (conexao-home.ts)。在一个名为 teste 的新页面中,我创建了一个函数 buscarUsuarios(与一个按钮相关联),它调用了 provider 中的函数 getRemoteUsers。
在 ionViewDidLoad 中,我对函数 getRemoteUsers 进行了相同的调用。
当页面teste启动时,它会调用函数并从http读取数据,但不要return在后台读取变量数据。
当我从按钮进行调用时,它 return 是第一次读取的数据并将其显示在页面中。
如何解决?
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');
}
}
感谢。
你不能那样做:
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;
}
这可能会在异步调用完成之前完成 return 语句。因为你通过 Observable 发出了一个异步的 http 请求。你应该阅读更多关于 here
相反,请尝试这样的事情:
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);
});
}
我创建了一个简单的应用程序(侧边菜单模板)和一个提供程序 (conexao-home.ts)。在一个名为 teste 的新页面中,我创建了一个函数 buscarUsuarios(与一个按钮相关联),它调用了 provider 中的函数 getRemoteUsers。
在 ionViewDidLoad 中,我对函数 getRemoteUsers 进行了相同的调用。 当页面teste启动时,它会调用函数并从http读取数据,但不要return在后台读取变量数据。 当我从按钮进行调用时,它 return 是第一次读取的数据并将其显示在页面中。
如何解决?
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');
}
}
感谢。
你不能那样做:
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;
}
这可能会在异步调用完成之前完成 return 语句。因为你通过 Observable 发出了一个异步的 http 请求。你应该阅读更多关于 here
相反,请尝试这样的事情:
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);
});
}